0

ajaxリクエストについて初めて明確ではありませんでした。

リンクをクリックすると、別のリンクが表示されます

ここで私がやろうとしていること(簡略化)ですが、問題は、内部のJSが実行したくないように見える場合です

HTML:

<html><body>
<div id="result">&nbsp;</div>
<a href="javascript:suggest('result'); return true;">click to see the link</a>
</body></html>

JavaScript

function evalResponse (request)
{
    try
    {
        //var responseText = request.responseText.replace (/\n/g, " ");
        var responseText = request.responseText;
        return eval('(' + responseText + ')');
    }
    catch (e)
    {
        alert ("line: " + e.lineNumber + "\nmessage: " + e.message + "\nName: " + e.name);
    }
}


function suggest(target_div)
{

    var opt = {
        // Use POST
method: 'post',
        // Send this lovely data
postBody: 'Action=Edit&search_word=' + search_item + '&target=' + textarea,
        // Handle successful response
onSuccess: function(t) {

            var json = evalResponse (t);

            data = json[1];

            if (errors.errorText == undefined)
            {
                           document.getElementById('target_div').update(data['link']);
            }


        },
        // Handle 404
on404: function(t) {
            alert('Error 404: location "' + t.statusText + '" was not found.');
        },
        // Handle other errors
onFailure: function(t) {
            alert('Error ' + t.status + ' -- ' + t.statusText);
        }
    }

    new Ajax.Request('handler.php', opt);
}

PHP ハンドラ:

    $jsonArray = array();
    $jsonArray[1]["link"] = '<a href="javascript:alert(\'fdg\');" onClick="return true;">link</a>';

$json = new Services_JSON();
echo $json->encode($jsonArray);
4

1 に答える 1

0

コードを単純化したために発生した可能性のある小さなエラーがいくつかあります。

postBody: 'Action=Edit&search_word=' + search_item + '&target=' + textarea

この行には、2 つの未定義の変数search_itemとがありtextareaます。フィドラーでは、この行を変更して、フィドラーから結果を取得します。これは、php スクリプトから得られる結果と同じです。

{"1":{"link":"<a href=\"javascript:alert('fdg');\" onClick=\"return true;\">link<\/a>"}}

ただし、eval の使用はお勧めしません。JSON.decode(response)サーバーからの結果を解析し、サーバーからのアラートなどの実行を防止するのは危険です。

if (errors.errorText == undefined)

存在しないオブジェクトにもアクセスしていますが、チェックが間違っています。errorsこの場合は未定義なので、これもチェックする必要があります。正しい比較は、typeof演算子を使用すると次のようになります。

if (typeof(errors) === "undefined" || typeof(errors.errorText) === "undefined")

最後に、この行に追加した qoutes が多すぎるという別の小さなエラーがあります。

document.getElementById('target_div').update(data['link']);

この行を使用したいと思います:

document.getElementById(target_div).update(data['link']);

一緒にあなたの例はうまくいきます。すべての変更を加えたこのフィドラーも参照してください。

于 2013-06-18T20:22:15.023 に答える