web-dev-qa-db-ja.com

jQueryは.on()イベントを使用して<a>要素のハッシュを取得します

マニュアルへの参照に悩まされる前に、私はかなり長い間これを研究していて、行き止まりになり続けています。正しくデバッグする方法すらわかりません。したがって、参考文献が引用されている場合は、それらが十分にコメントされ、教育的であることを確認してください。これは、私がPHP/mySQL開発者であり、JavaScriptオブジェクト参照モデルが少し混乱しているためです(ただし、学ぶために最善を尽くしています!:))。

JQueryv1.7.2を使用してjQueryの知識を更新しようとしています。どうやらライブイベントは非推奨になり、.on()に置き換えられました。 jQueryのドキュメントには、古い「クリック」または「ライブ」イベントを.on()を使用するスクリプトとブレンドしないように記載されています。

Onの使用に慣れようとしているときに、特定のURLのハッシュをキャプチャしようとしています。

このページは次のとおりです(ヘッダーにはすでにjquery.min.1.7.2.jsが読み込まれています)。

    <div id='menuHolder' style="position:relative; margin-left:50px;margin-bottom:30px; padding-top:35px; min-width:600px;z-index:998;">
      <ul id="menu">
         <li><a href="#">Events</a>
            <ul id="events">
                <li>
                    <img class="corner_inset_left" alt="" src="images/menu/corner_inset_left.png"/>
                    <a id="linker21 menu" class="test AJAXcaller" href="index.php#?p=1&amp;d=AJAXcontent&i=1&amp;k=<?=$_SESSION['authcpanel']['key']?>" rel="nofollow">Upcoming Events</a>
                    <img class="corner_inset_right" alt="" src="images/menu/corner_inset_right.png"/>
                </li>
                <li><a href="#">List All Events</a></li>
                <li><a id="linkermenu" class="test AJAXcaller" href="index.php#?p=24&amp;d=AJAXcontent&i=1&amp;k=<?=$_SESSION['authcpanel']['key']?>" rel="nofollow">Add Events</a></li>
                <li class="last">
                    <img class="corner_left" alt="" src="images/menu/corner_left.png"/>
                    <img class="middle" alt="" src="images/menu/dot.gif"/>
                    <img class="corner_right" alt="" src="images/menu/corner_right.png"/>
                </li>
            </ul>
         </li>
      </ul>
    </div>

<script>
    $(document).on("click", "a.AJAXcaller", function(){ 
        alert("Goodbye!");
        alert($(this).attr("hash"));
    }); 
</script>

最初のアラートは「イベントの追加」リンク(ハッシュがあります)をクリックすると発生し、「さようなら!」を中継し、次に2番目のハンドラーが発生して「未定義」を中継します。このハッシュにアクセスするにはどうすればよいですか?

私の古いコードは次のとおりで、機能しますが、ページと呼ばれるajaxにはイベントハンドラーがアタッチされていないため、.on()イベントを使用しています。また、今回はそれを適切に行う方法を学ぶつもりなら;)、非推奨の関数を関与させたくありません...

古いコード(動作)

var linkClickAction = {
        'a.AJAXcaller' : function(element){
            element.onclick = function(){
                var locationString = $(this).attr("hash");
                locationString = locationString.replace(/.*\#(.*)/, "$1")
            var parameterString = locationString.replace(/.*\?(.*)/, "$1"); // onclick="sndReq('j=1&q=2&t=127.0.0.1&c=5');

            var parameterTokens = parameterString.split("&"); // onclick="sndReq('j=1,q=2,t=127.0.0.1,c=5');
            var parameterList = new Array();
            for (j = 0; j < parameterTokens.length; j++) {
                var parameterName = parameterTokens[j].replace(/(.*)=.*/, "$1"); // j
                var parameterValue = parameterTokens[j].replace(/.*=(.*)/, "$1"); // 1
                parameterList[parameterName] = parameterValue;
            }
            var page = parameterList['p'];
            var key = parameterList['k'];
            var includesDir = parameterList['i'];
            var changeDiv = parameterList['d'];

            sndReq(page,key,includesDir,changeDiv,parameterString); 
            return false;       
            }
        }

    };
Behaviour.register(linkClickAction);

基本的にリスナーを処理するbehaviour.jsスクリプトもロードされました。当時、私はjQueryをまったく使用していませんでした。それは素晴らしく、比較的高速(小さな.jsファイル、無関係なコードなし)でしたが、UIで凝ったものを処理することになると、効果的なJavaScriptを記述できるという限界に達しました。したがって、とにかくページの読み込み時にjQueryスクリプトを読み込む必要があります。すでに読み込まれていることを確認して、ページを読み込むために不要なスクリプトを追加する代わりに、その関数を利用しようとしています。したがって、この目標を達成するためにネイティブjQuery1.7.2関数を使用する結果を見つけたいと思います。

[〜#〜]結果[〜#〜]

.attr()を使用してDOMオブジェクトのプロパティを検索すると、jQuery1.6以降が破損する可能性があることが判明しました。したがって、.prop()を使用するのが方法でした。修正されたコードは次のとおりです。

/*
Page:           rating.js
Created:        Aug 2006
Last Mod:       May 30, 2012
Modder:         Darren Maurer
*/

    function sndReq(page,key,includesDir,changeDiv,parameterString) {
        var divToChange = document.getElementById(changeDiv); // the Div that the data will be put into

        // switch Div with a loading div
        divToChange.innerHTML = '<div class="loading"><img src="images/loading.gif" title="Saskatoon.CityGuru.ca - Loading Page" alt="Saskatoon.CityGuru.ca - Loading Page" border="0"/></div>';

        if (includesDir == 1){
            //Find Current Working Directory.  Use to find path to call other files from
            /*var myloc = window.location.href;
            var locarray = myloc.split("/");
            delete locarray[(locarray.length-1)];
            var arraytext = locarray.join("/");
            */
            $.ajax({
                type: "POST",
                url: "AJAXCaller.php",
                data: parameterString,
                success: function(msg){
                    $('#'+changeDiv).html(msg);
                }
            });
        } 
    }

/* =======END AJAX FUNCTIONS================= */

/* =======BEGIN CLICK LISTENER FUNCTIONS================= */
/* Listens to any a href link that has a class containing ' AJAXcaller' */
/* ie. <a id="link1" class="test AJAXcaller" href="index.php#http://233.help?id=22&think=33" rel="nofollow">> AJAX TEST LINK <</a> */
$(document).on("click", "a.AJAXcaller", function(){
    alert($(this).prop("hash")); 
            var locationString = $(this).prop("hash");
            locationString = locationString.replace(/.*\#(.*)/, "$1")
            var parameterString = locationString.replace(/.*\?(.*)/, "$1"); // onclick="sndReq('j=1&q=2&t=127.0.0.1&c=5');

            var parameterTokens = parameterString.split("&"); // onclick="sndReq('j=1,q=2,t=127.0.0.1,c=5');
            var parameterList = new Array();
            for (j = 0; j < parameterTokens.length; j++) {
                var parameterName = parameterTokens[j].replace(/(.*)=.*/, "$1"); // j
                var parameterValue = parameterTokens[j].replace(/.*=(.*)/, "$1"); // 1
                parameterList[parameterName] = parameterValue;
            }
            var page = parameterList['p'];
            var key = parameterList['k'];
            var includesDir = parameterList['i'];
            var changeDiv = parameterList['d'];
            sndReq(page,key,includesDir,changeDiv,parameterString); 
            return false;   
}); 

それが誰かを助けることを願っています、それは間違いなく私にとって命の恩人でした!

11
MaurerPower

要素にハッシュ属性がありません。 href属性を取得し、javascriptのsubstr関数とindexOf関数を使用して、#で文字列を分割してみてください

var href = $(this).attr("href");
var hash = href.substr(href.indexOf("#"));

使用することもできます

$(this).prop("hash");
33
Devin Crossman
$('a.js-hash').click(function() {

    // Store hash
    var hash = this.hash;

    // Using jQuery's animate() method to add smooth page scroll
    $('html, body').animate({
        scrollTop: $(hash).offset().top
    }, 1000, function() {

        // Add hash (#) to URL when done scrolling (default click behavior)
        window.location.hash = hash;
    });

    // Prevent default anchor click behavior
    return false;
});
3
Oleg