Naps: Problem mit der Pfadangabe

Hi,

ich bin grad dabei mir die AJAX Star Rating Bar anzupassen.

Mein Problem ist, dass das Script entweder FALSE zurückgibt oder gar nichts macht, was meiner Meinung nach nur an der Pfadangabe liegen kann, da ich die Scripte anders abgespeichert hab.

In meinem rating.js geschieht folgendes:

var ratingAction = {  
		'a.rater' : function(element){  
			element.onclick = function(){  
  
			var parameterString = this.href.replace(/.*\?(.*)/, "$1"); // onclick="sndReq('j=1&q=2&t=127.0.0.1&c=5');  
			var parameterTokens = parameterString.split("&"); // onclick="sndReq('j=1,q=2,t=127.0.0.1,c=5');  
			var parameterList = new Array();  
  
			for (j = 0; j < parameterTokens.length; j++) {  
				var parameterName = parameterTokens[j].replace(/(.*)=.*/, "$1"); // j  
				var parameterValue = parameterTokens[j].replace(/.*=(.*)/, "$1"); // 1  
				parameterList[parameterName] = parameterValue;  
			}  
			var theratingID = parameterList['q'];  
			var theVote = parameterList['j'];  
			var theuserIP = parameterList['t'];  
			var theunits = parameterList['c'];  
			  
			//for testing	alert('sndReq('+theVote+','+theratingID+','+theuserIP+','+theunits+')'); return false;  
			sndReq(theVote,theratingID,theuserIP,theunits); return false;		  
			}  
		}  
		  
	};  
Behaviour.register(ratingAction);

und im behavior.js

var Behaviour = {  
	list : new Array,  
	  
	register : function(sheet){  
		Behaviour.list.push(sheet);  
	},  
	  
	start : function(){  
		Behaviour.addLoadEvent(function(){  
			Behaviour.apply();  
		});  
	},  
	  
	apply : function(){  
		for (h=0;sheet=Behaviour.list[h];h++){  
			for (selector in sheet){  
				list = document.getElementsBySelector(selector);  
				  
				if (!list){  
					continue;  
				}  
  
				for (i=0;element=list[i];i++){  
					sheet[selector](element);  
				}  
			}  
		}  
	},  
	  
	addLoadEvent : function(func){  
		var oldonload = window.onload;  
		  
		if (typeof window.onload != 'function') {  
			window.onload = func;  
		} else {  
			window.onload = function() {  
				oldonload();  
				func();  
			}  
		}  
	}  
}  
  
Behaviour.start();  
  
function getAllChildren(e) {  
  // Returns all children of element. Workaround required for IE5/Windows. Ugh.  
  return e.all ? e.all : e.getElementsByTagName('*');  
}  
  
document.getElementsBySelector = function(selector) {  
  // Attempt to fail gracefully in lesser browsers  
  if (!document.getElementsByTagName) {  
    return new Array();  
  }  
  // Split selector in to tokens  
  var tokens = selector.split(' ');  
  var currentContext = new Array(document);  
  for (var i = 0; i < tokens.length; i++) {  
    token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;  
    if (token.indexOf('#') > -1) {  
      // Token is an ID selector  
      var bits = token.split('#');  
      var tagName = bits[0];  
      var id = bits[1];  
      var element = document.getElementById(id);  
      if (tagName && element.nodeName.toLowerCase() != tagName) {  
        // tag with that ID not found, return false  
        return new Array();  
      }  
      // Set currentContext to contain just this element  
      currentContext = new Array(element);  
      continue; // Skip to next token  
    }  
    if (token.indexOf('.') > -1) {  
      // Token contains a class selector  
      var bits = token.split('.');  
      var tagName = bits[0];  
      var className = bits[1];  
      if (!tagName) {  
        tagName = '*';  
      }  
      // Get elements matching tag, filter them for class selector  
      var found = new Array;  
      var foundCount = 0;  
      for (var h = 0; h < currentContext.length; h++) {  
        var elements;  
        if (tagName == '*') {  
            elements = getAllChildren(currentContext[h]);  
        } else {  
            elements = currentContext[h].getElementsByTagName(tagName);  
        }  
        for (var j = 0; j < elements.length; j++) {  
          found[foundCount++] = elements[j];  
        }  
      }  
      currentContext = new Array;  
      var currentContextIndex = 0;  
      for (var k = 0; k < found.length; k++) {  
        if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {  
          currentContext[currentContextIndex++] = found[k];  
        }  
      }  
      continue; // Skip to next token  
    }  
    // Code to deal with attribute selectors  
    if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {  
      var tagName = RegExp.$1;  
      var attrName = RegExp.$2;  
      var attrOperator = RegExp.$3;  
      var attrValue = RegExp.$4;  
      if (!tagName) {  
        tagName = '*';  
      }  
      // Grab all of the tagName elements within current context  
      var found = new Array;  
      var foundCount = 0;  
      for (var h = 0; h < currentContext.length; h++) {  
        var elements;  
        if (tagName == '*') {  
            elements = getAllChildren(currentContext[h]);  
        } else {  
            elements = currentContext[h].getElementsByTagName(tagName);  
        }  
        for (var j = 0; j < elements.length; j++) {  
          found[foundCount++] = elements[j];  
        }  
      }  
      currentContext = new Array;  
      var currentContextIndex = 0;  
      var checkFunction; // This function will be used to filter the elements  
      switch (attrOperator) {  
        case '=': // Equality  
          checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };  
          break;  
        case '~': // Match one of space seperated words  
          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };  
          break;  
        case '|': // Match start with value followed by optional hyphen  
          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };  
          break;  
        case '^': // Match starts with value  
          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };  
          break;  
        case '$': // Match ends with value - fails with "Warning" in Opera 7  
          checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };  
          break;  
        case '*': // Match ends with value  
          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };  
          break;  
        default :  
          // Just test for existence of attribute  
          checkFunction = function(e) { return e.getAttribute(attrName); };  
      }  
      currentContext = new Array;  
      var currentContextIndex = 0;  
      for (var k = 0; k < found.length; k++) {  
        if (checkFunction(found[k])) {  
          currentContext[currentContextIndex++] = found[k];  
        }  
      }  
      // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);  
      continue; // Skip to next token  
    }  
  
    if (!currentContext[0]){  
    	return;  
    }  
  
    // If we get here, token is JUST an element (not a class or ID selector)  
    tagName = token;  
    var found = new Array;  
    var foundCount = 0;  
    for (var h = 0; h < currentContext.length; h++) {  
      var elements = currentContext[h].getElementsByTagName(tagName);  
      for (var j = 0; j < elements.length; j++) {  
        found[foundCount++] = elements[j];  
      }  
    }  
    currentContext = found;  
  }  
  return currentContext;  
}

In meinerm rating.js bei folgender Zeile:
var parameterString = this.href.replace(/.*\?(.*)/, "$1");
liegt auch denk ich das Problem. Die datei rpc.php auf die zugegriffen wird hat sich verschoben nach /ordner/ordner/rpc.php und lag vorher /rpc.php

Sorry, dass ich das ganze behvior.js gepostet hab, ich weiß nur leider nicht wo dort das Problem sein könnte.

Danke.
MfG
Naps

  1. Hallo!

    Ich habe selten ein so unnötig kompliziertes JS gelesen. Wenn ich das Script richtig lese, analysierst Du zunächst auf ausgesprochen umständliche Weise (einfacher wäre hier

    var params = [];  
    this.href.replace(/[?&]([^&=]+)=([^&]+)/, function(full, key, value) { params[key] = value; });
    

    ...), function die GET-Parameter in der Link-URL des übergebenen Links, wobei diese nicht mit unescape vorher dekodiert werden - solange keine URI-encodeten Zeichen darinnen sind, ist das kein Problem. Danach wird die Funktion sndReq mit bestimmten Parametern aufgerufen und das Event abgebrochen. Die unnötige Komplexität setzt sich übrigens in behaviour.js fort.

    An Deiner Stelle würde ich mal versuchen, mir die jeweilige href auszugeben, um herauszufinden, welche Parameter tatsächlich ankommen.

    Gruß, LX

    --
    RFC 2324, Satz 7 (Sicherheit): Jeder, der zwischen meinem Kaffee und mir steht, gilt als unsicher.
    1. An Deiner Stelle würde ich mal versuchen, mir die jeweilige href auszugeben, um herauszufinden, welche Parameter tatsächlich ankommen.

      werd ich mal machen...

      MfG
      Naps