0

这是一个奇怪的问题。

我有以下 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)从选择框传输到目标文本区域(base64_decoded——此处未显示 javascript 代码)。

假设我转移了 3 个选择('aaa'、'aaaa'、'aaaaa'),然后我在 textarea 中得到 'aaa,aaaa,aaaaa'。这就是我要的。

然后我单击提交按钮,但是,我没有在 textarea 的 $_POST 变量中获取“aaa,aaaa,aaaaa”,而是只得到“aaa,aaaa”。

我注意到的一些事情:

  1. 'aaa,aaaa' 转移在 $_POST 中正确显示。
  2. 'aaaaa' 转移在 $_POST 中正确显示。
  3. 'aaa,aaaaa' 转移在 $_POST 中正确显示。
  4. 相同的错误和成功出现在“b”的类似变体中。
  5. 'UT1,UT2,UT3,UT4,UT5' 转移在 $_POST 中正确显示。
  6. *如果我在 textarea 中输入'aaa,aaaa,aaaaa',它会在 $_POST 中正确显示。*

我很困惑,不知道从哪里开始追查问题。

问候,

标记

网关功能:

/**
* 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);
}
4

1 回答 1

0

好的,我发现了这个错误,这是一个 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;
}

It seams there is a problem in your base64 encoder but i solved it with the decode. By dont adding not prinable chars like \0 to the string.

http://www.asciitable.com/

于 2013-01-23T10:09:36.517 回答