In-Text

M8XiKiN6

The human Debugger
30 Dezember 2007
27
1
Hallo zusammen,

Ich möchte in mein Projekt soetwas wie In-Text Werbung machen, nur dass man für Einbledungen kein Geld bekommt, sondern seine eigene Keywords auf anderen Seiten angezeigt werden.

So. Jetzt habe ich es mal so versucht:

1.) Der User bindet folgenden Code auf seiner Website ein. Dann sieht das ungefähr so aus:
HTML:
<html>
	<head>
		<script src="https://127.0.0.1/swapping/links/in_text.php?pub=1&pid=3" type="text/javascript"></script>
<script type="text/javascript"><!--
	
	var pub        = "1";
	var project_id = "3";
	
	set_links(pub, project_id);
	//-->
</script>
	</head>
	<body>
		<span id="in_text">Wer das ließt ist dumm!</span>
	</body>
</html>

Dabei wird der Beispieltext "Wer das ließt ist dumm" markiert^^

2.) Wie ihr seht ruft die Seite(https://localhost/test.html) dieses Skript auf:
PHP:
<?php
	if(!$uid = $_GET['pub']) die("Parameter 'pub' is not defined!");
	if(!$pid = $_GET['pid']) die("Parameter 'pid' is not defined!");
	
	require_once("./mysql/mysql.inc");
	
	srand((double)microtime()*10000000);	
	
	//Connect MySql
	mysqlconnect();
	
	//Set $_CONFIG
	$_CONFIG = fetch_array("SELECT * FROM `config` LIMIT 1");
?>
var xmlhttp = null;

function set_links(pub, pid) {
	var howmany = 1;
	
	if (window.ActiveXObject) {
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				//Error!
			}
		}
	} else if (window.XMLHttpRequest) {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch(e) {
			//Error!
		}
	}
	
	if(howmany > 0 && xmlhttp) {
		for(i = 0; i < howmany; i++) {
			var post ='pub=' + pub + '&pid=' + pid;

			xmlhttp.open('POST', './in_text_replace.php');
			xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			xmlhttp.send(post);
			
			while(xmlhttp.readyState != 4) {
				//Wait...zZz
			}
			
			var text = xmlhttp.responseText;
			
			document.getElementById('in_text').innerHTML = text;
		}
	}
}

So. Das Dokument in_text_replace leigt in dem selben Ordner wie das Skript in_text.php(Javascript) und die testdatei test.html zwei Ordner höher.

Leider sagt mir Firebug, dass die Datei per Ajax nicht aufgerufen werden kann, weil sie nicht gefunden wurde!

Ich schätze, dass das Javascript-script in dem Ordner der test.html anstatt im Ordner von sich selbst die Datei in_text_replace öffnen möchte!

Also meine Frage: Wie kann man das anderst lösen?
 
Deine Vermutung ist richtig. Ein AJAX-Request nimmt als default-pfad die url der aktuellen seite und nicht die url eines eingebundenen scriptes. (Das solltest du aber auch in Firebug sehen.)

Es gibt 2 Möglichkeiten, das zu lösen:
1.) Du weißt wo das Script liegt, und gibst den absoluten pfad an.
2.) Wenn du den Pfad dynamisch haben möchtest, kannst du das so machen, wie es die bekannteren Scripte wie scriptaculous machen. (Nach der in_text.php Datei im html-dokument suchen und dort den pfad auslesen.)
Hier mal dazu ein umgeschreibener Code, der für dich funktionieren sollte:
Code:
function getAJAXPath() {
	var path = null;
	var scripts = document.getElementsByTagName("script");
	var curScript = 0;
	while( curScript < scripts.length && path == null ) {
		if( scripts[curScript].src && scripts[curScript].src.match(/in_text\.php(\?.*)?$/) ) {
			path = scripts[curScript].src.replace(/in_text\.php(\?.*)?$/,'');
		}
		curScript++;
	}
	
	if( path == null ) {
		path = "";
	}
	
	return path;
}

Das ganze funktioniert nun so:

Code:
var path = getAJAXPath();
xmlhttp.open('POST', path + 'in_text_replace.php');

Der Code sollte funktionieren.
 
Zuletzt bearbeitet:
@Moloc:

Vielen Dank für deinen Code. Leider geht das auch ned, weil die test.html ja dann auf einer anderen Domain liegt und wie u gesagt hast, dass Ajax Requests nicht von ausserhab gehen...

Gibt es Alternativen? Wie machen das eig. die anderen In-Text Anbieter?
 
Achso, ja, da war ich zu schnell mit antworten. Wenn das unterschiedliche URLs sind, dann kannst du kein XMLHTTPRequest verwenden (Das gibt eine Sicherheitsfehlermeldung.)

Im Prinzip funktioniert das immer so, dass Scripte aufgerufen werden, denen man einen Parameter als GET mitanhängt, wie du es schon bei in_text.php hast.

Was hindert dich daran, anstatt dem in_text.php und dem AJAX-Request sofort den content rauszuschicken, der ersetzt werden soll?