0

私はしばらくJSでコーディングしていますが、どういうわけか、常に「スクラッチヘッド」タイプの問題が発生します。掘り下げる必要があると思いますが、それまでの間、誰かがこれを手伝ってくれませんか?

ここに問題があります。 アイテム ($(this) で取得) をコールバック関数に渡しています。このコードは機能しません-私が本当にそうすべきだと思うとき。$(this) を変数に入れ (データのクローンを作成しますか?)、関数を介してコールバックに渡したので、確かにデータが失われることはありませんか? しかし、それはそうです、そして恐ろしく

// Allow hrefs with the class 'ajax' and a rel attribute set with a selector to load via ajax into that selector.
$(".ajax").unbind("click").click
(
    function(e)
    {

        var locationhint = $(this).attr("rel");            
        var $location = $(locationhint);
        $location.html ("<img src='images/blockloading.gif' />");            
        $location.load($(this).attr("href").replace("index.php", "ajax.php"), '', function($location){dready($location);}); 
        e.preventDefault();
    }
); 

今はうまくいきません

これは機能します:

$(".ajax").unbind("click").click
(
    function(e)
    {             
        $("#myspecificdiv").load($(this).attr("href").replace("index.php", "ajax.php"), '', function(){dready($("#myspecificdiv"));}); 
        e.preventDefault();
    }
); 

スコープの問題だと思いますが、要素のテキストIDを渡しているため、上記の「静的」とまったく同じであるため、これも機能するはずです。これも壊れます: .

$(".ajax").unbind("click").click
(
    function(e)
    {
        var locationhint = $(this).attr("rel");            
        var $location = $(locationhint);
        $location.html ("<img src='images/blockloading.gif' />");  
        var locationid = "#" + $location.attr("id");
        $location.load($(this).attr("href").replace("index.php", "ajax.php"), '', function(locationid){dready($(locationid));});
        e.preventDefault();
    }
); 

壊れたものは、場所 ID を console.log に記録すると、ターゲット DIV の内部 HTML を返します。$location.attr("id"); どこにも呼び出しがない場合、生の HTML を返すことはできませんか? それで、それは私が取る範囲ですか?しかし、内部 HTML を吐き出すにはどうすればよいのでしょうか。

解決策はありますか?

更新: これを投稿してから 12 秒後に、コールバックの内部関数 ($location){dready($location);} が AJAX 呼び出しの応答を自動的に通過させる可能性があることがわかりました。しかし、なぜ?

4

1 に答える 1

1

これを行うことはできませんfunction($location){dready($location);}が、外側のスコープには $location が定義されているため、コールバック関数はこの変数をコールバック関数に渡そうとせずに理解するため、その必要はありません。

function(){dready($location);}

動作します。

スコープの問題を克服する別の方法は、$.proxyを使用することです。これにより、関数が呼び出される this コンテキストを設定できます。jQuery.proxy( dready, $location )コールバックとして使用できる関数を返します。この関数は、呼び出されると、これが $location に設定されたメソッド dready を呼び出します。

例えば

$location.load($(this).attr("href").replace("index.php", "ajax.php"), '', jQuery.proxy( dready, $location );});
于 2011-05-20T10:11:11.090 に答える