这是一个奇怪的问题。
我有以下javascript代码:
function doTransfer(target, source)
{
var targetObj = f_getElement(target);
var tempText = targetObj.value.split(',');
var len = tempText.length;
var targetText = new Array;
var text;
var selection;
var split;
for(var i = 0; i < len; i ++)
{
text = trim(tempText[i]);
if(text)
targetText.push(text);
}
var sourceObj = f_getElement(source);
len = sourceObj.options.length;
for(i = 0; i < len; i++)
{
split = sourceObj.options[i].value.split('_');
selection = decode_base64(split[1]);
// When searching for existing word, we ignore case as different words may be indicated by different use of case on the same letters.
// i.e. we trust the user to get it right.
if(sourceObj.options[i].selected && (searchArray(targetText, selection) == -1))
targetText.push(selection);
}
targetObj.value = targetText.join(',');
}
function f_getElement(id)
{
return document.getElementById(id);
}
这一切都运行正常,并将多个选择(base64_encoded)从选择框传输到目标textarea(base64_decoded - 此处未显示javascript代码)。
假设我转移3个选项('aaa','aaaa','aaaaa'),然后我在textarea中获得'aaa,aaaa,aaaaa'。这就是我想要的。
然后我点击了提交按钮,但是我没有在textarea的$ _POST变量中获得'aaa,aaaa,aaaaa',而是获得'aaa,aaaa'。
我注意到的一些事情:
我很困惑,不知道从哪里开始追踪问题。
此致
标记
网关功能:
/**
* Gateway to AJAX javascript functions
* @param input - JSON string representing an array of sets of instructions to be processed in numerical order. At the very
* least a startFunction() method should be present in each set.
*/
function gateway(input)
{
var parsedInput = JSON.parse(input);
var inputLen = parsedInput.length;
if(gateway.aobj_index == undefined)
gateway.aobj_index = -1;
gateway.aobj_index++;
for(var i = 0; i < inputLen; i++)
{
if(parsedInput[i].startFunction != undefined)
{
A_OBJ[gateway.aobj_index] = new AJAXOBJECT();
A_OBJ[gateway.aobj_index].input = parsedInput[i];
A_OBJ[gateway.aobj_index].evalReturn = eval('(' + A_OBJ[gateway.aobj_index].input.startFunction + '())');
if(A_OBJ[gateway.aobj_index].evalReturn == false)
{
return false;
}
}
else
{
alert('No startFunction() defined');
return false;
}
gateway.aobj_index++;
}
return true;
}
/**
* The object used for independent AJAX instances
*/
function AJAXOBJECT()
{
//properties
this.input = null;
this.processedScript = null;
this.phpResponse = null;
this.targetObj = null;
this.evalReturn = null;
// methods
this.checkInput = checkInput;
this.doXmlHttp = doXmlHttp;
}
/**
* Check required input parameters are present in input
* @param input array
* @return false|true
*/
function checkInput(inputArray)
{
var len = inputArray.length;
for(var i = 0; i < len; i++)
{
if(this.input[inputArray[i]] == undefined)
{
alert('required input parameter is missing: ' + inputArray[i]);
return false;
}
}
return true;
}
/**
* Create the xmlHttp object
* @return xmlHttp object
*/
function createXmlHttpObject()
{
var xmlHttp = false;
//Check if we are using IE.
try
{
//If the javascript version is greater than 5.
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
//If not, then use the older active x object.
try
{
//If we are using IE.
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (E)
{
//Else we must be using a non-IE browser.
xmlHttp = false;
}
}
//If we are using a non-IE browser, create a JavaScript instance of the object.
if (!xmlHttp && typeof XMLHttpRequest != undefined)
{
xmlHttp = new XMLHttpRequest();
}
return xmlHttp;
}
/**
* Execute the xmlHTTP object
*
* @return true|false
*/
function doXmlHttp()
{
if(this.targetObj == null)
{
alert('No AJAXOBJECT targetObj property set');
return false;
}
if(this.processedScript == null)
{
alert('No AJAXOBJECT processedScript property set');
return false;
}
var targetObj = this.targetObj;
var xmlHttp = createXmlHttpObject();
xmlHttp.open("GET", this.processedScript, true);
//alert(this.processedScript);
xmlHttp.onreadystatechange = function()
{
if((xmlHttp.readyState == 4) && (xmlHttp.status == 200))
{
try
{
this.phpResponse = JSON.parse(xmlHttp.responseText);
}
catch(err)
{
alert('HTTP status: ' + xmlHttp.status + '. ' + err.message + ' ERROR. PHP says:\n' + xmlHttp.responseText);
return false;
}
if(this.phpResponse.ERROR)
{
alert('PHP ERROR:\n' + this.phpResponse.ERROR);
return false;
}
if(this.phpResponse.innerHTML)
targetObj.innerHTML = this.phpResponse.innerHTML;
//alert(this.phpResponse.next);
// Further action to be taken?
if(this.phpResponse.next != undefined)
gateway(JSON.stringify([this.phpResponse]));
}
}
xmlHttp.send(null);
A_OBJ[gateway.aobj_index].xmlHttp = xmlHttp;
return true;
}
/**
* Get an object for the requested HTML element ID
* @return element object
*/
function f_getElement(id)
{
return document.getElementById(id);
}
答案 0 :(得分:0)
好的,我发现了这个bug,这是一个base64编码问题。
首先是破坏代码的jsFiddle: http://jsfiddle.net/mexd7/2/
Oben Firebug控制台: https://getfirebug.com/logging
通过添加单词并查看所看到的内容来玩游戏。
现在这里是固定版本: http://jsfiddle.net/mexd7/1/
function decode_base64(s)
{
var e={},i,k,v=[],r='',w=String.fromCharCode;
var n=[[65,91],[97,123],[48,58],[43,44],[47,48]];
for(z in n) {
for(i=n[z][0];i<n[z][1];i++) {
v.push(w(i));
}
}
for(i=0;i<64;i++) {
e[v[i]]=i;
}
for(i=0;i<s.length;i+=72) {
var b=0,c,x,l=0,o=s.substring(i,i+72);
for(x=0;x<o.length;x++) {
c=e[o.charAt(x)];b=(b<<6)+c;l+=6;
while(l>=8) {
var charCode = (b>>>(l-=8))%256;
if (charCode > 31) {
// only add printable chars
r+=w(charCode);
}
}
}
}
return r;
}
它接缝你的base64编码器有问题,但我用解码解决了它。 不要在字符串中添加像\ 0这样的可打印字符。