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') を転送すると、テキストエリアに 'aaa,aaaa,aaaaa' が表示されます。これが私が欲しいものです。

次に、送信ボタンをクリックしますが、テキストエリアの $_POST 変数で「aaa、aaaa、aaaaa」を取得する代わりに、「aaa、aaaa」のみを取得します。

私が気づいたいくつかのこと:

  1. 'aaa,aaaa' transfer は $_POST に正しく表示されます。
  2. 'aaaaaa' 転送は $_POST に正しく表示されます。
  3. 'aaa,aaaaa' transfer は $_POST に正しく表示されます。
  4. 'b' の同様のバリエーションで、同じエラーと成功が表示されます。
  5. 転送された 'UT1,UT2,UT3,UT4,UT5' は $_POST に正しく表示されます。
  6. *テキストエリアに「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/

オーベン 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 のような印刷できない文字を文字列に追加しないでください。

http://www.asciitable.com/

于 2013-01-23T10:09:36.517 に答える