9

これが私の状況です。ウェブサイト全体にいくつかのリンクがあります。それらのいくつかは次のようになります。

<a target="_blank" onclick="someFunction()" href="/somFile.pdf">some file</a>

いくつかは次のようになります。

<a target="_blank" href="/somFile.pdf">some file</a>

クリックすると、すべてのリンクが someFunction() を呼び出す必要があります。onclick 属性に呼び出しがあるものは、従来のコンテンツ ページです。新しいページには、次のように jQuery クリック イベントが関連付けられています。

$(document).ready(function(){
  $('a[href$=".pdf"]').click(function() {
    someFunction();
  });
});

これが問題です。someFunction() を更新することはできますが、実際のリンクやその jQuery に触れることはできません。必要なのは、クリックされたリンクの href 値を知ることです。someFunction() 内で次を使用してみました:

var ev = window.event;
origEl = ev.target || ev.srcElement;
console.log(origEl.href);

しかし、これは機能しません。私も試しconsole.log(window.event)てみましたが、何も得られませんでした。未定義だと言います。ここで何が欠けているのか、または関数が呼び出されたときに参照を渡さないと基本的に不可能ですか?

編集:明確にするために、私は短期的または中期的な解決策としてsomeFunction()、onclickまたはjQueryコードブラックでの呼び出しを編集できないため、たとえばそれらを変更することはできませんsomeFunction(this)。ただし、そうしない限り、 someFunction() 内から href を取得できるかどうかはわかりません:(

4

5 に答える 5

12

これはPURE JavaScriptです

    //assuming links inside of a shared class "link"
    for(var i in document.getElementsByClassName('link')) {
        var link = document.getElementsByClassName('link')[i];

        link.onclick = function(e) { 
            e.preventDefault();

            //using returned e attributes
            window.location = e.srcElement.attributes.href.textContent;     
        } 
    } 

    //tested on Chrome v31 & IE 11
    //not working in Firefox v29
    //to make it work in all browsers use something like:

    if (e.srcElement === undefined){
    //scrElement is undefined in Firefox and textContent is depreciated

      window.location = e.originalTarget.attributes.href.value;
    } else {
      window.location = e.srcElement.attributes.href.textContent;
    }

    //Furthermore; when you setAttribute("key" "value"); 
    //you can access it with the above node link. 
    //So say you want to set an objectId on something     
    //manually and then grab it later; you can use 

    //Chrome & IE
    //srcElement.attributes.objectid.textContent; 

    //Firefox
    //e.originalTarget.attributes.objectid.value;

    //*Note: for some unknown reason the attribute being defined as "objectId" is changed to "objectid" when it's set.
于 2014-06-14T18:58:08.073 に答える
11

this.hrefコールバック内以外には何も必要ありませんclick

$(document).ready(function()
{    
    function someFunction(foo)
    {
        console.log(foo);
    }

    $('a[href$=".pdf"]').click(function()
    {
        someFunction(this.href);
    });
});

this代わりに、次のように の中にある<a>偶数を指定することもできますsomeFunction:

$(document).ready(function()
{    
    function someFunction()
    {
        console.log(this.href);
        console.log(event);
    }

    $('a[href$=".pdf"]').click(someFunction);
});

または、それがあなたに合わない場合は、次の方法でより洗練されたものにすることができますFunction.apply:

$(document).ready(function()
{    
    function someFunction(event)
    {
        console.log(this.href);
        console.log(event);
    }

    $('a[href$=".pdf"]').click(function (event)
    {
        someFunction.apply(this, event);
    });
});
于 2012-04-16T23:32:39.850 に答える
2

だから私はこれをしばらく煮詰めて、短期的な解決策を思いつきました...それはかなりハックで、それをするのはちょっと汚いと感じますが、必要なことをできるようになるまで、やらなければならないことをやらなければならないことがあります.してください...とにかく、同様のコーナーに戻っている可能性のある他の人のために、ここに私の醜い解決策を投稿しています...

OPで触れることが許可されている唯一のコードは、 someFunction() 関数自体です。また、それが配置された場所と同じ場所に追加のコードを追加することもできます。これは私が行ったことです...

基本的に解決策は、href 値を関数に公開された変数に入れる追加のクリック リスナーを作成し、新しいクリック関数が確実に機能するように someFunction() コードを短いタイムアウトでラップすることです。

<!-- STUFF I CAN'T TOUCH! (located on-page) -->
<a target="_blank" onclick="someFunction()" href="/somFile.pdf">some file</a>
<a target="_blank" href="/somFile.pdf">some file</a>

<script type='text/javascript'>
$(document).ready(function(){
  $('a[href$=".pdf"]').click(function() {
    someFunction();
  });
});
</script>
<!-- END STUFF I CAN'T TOUCH! -->

/*** STUFF I CAN TOUCH! (located in a script include) ***/
// hackjob!
$(document).ready(function(){
  $('a').click(function() {
    if ($(this).attr('href')) someFunction.href = $(this).attr('href');
  });
});

function someFunction(a) {
  // more hackjob!
  window.setTimeout("console.log(someFunction.href);",200);
}
/*** END STUFF I CAN TOUCH!***/

とにかく、ええ、それは醜いですが、うまくいけば、誰かが必死になっている場合、それが誰かのお尻を救うかもしれません.

于 2012-04-19T04:02:12.423 に答える
1

this.hrefまたは、より適切な jQueryを使用して$(this).attr('href')、各リンクの値を取得します。

于 2012-04-16T23:33:54.507 に答える
0

どうぞ。これを試して。必要に応じて調整してください(私のフィドルに存在しなかったため、pdfリンクを削除しました)。

編集: FF と Chrome でテスト済み。それがうまくいくかどうか教えてください。

http://jsfiddle.net/lazerblade01/dTVz5/22/

于 2012-04-16T23:52:13.530 に答える