2012-04-16 4 views
4

Вот моя ситуация. У меня есть ссылки на веб-сайте. Некоторые из них выглядят так:javascript get href при нажатии ссылки

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

и некоторые выглядят так:

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

Все ссылки должны называть SomeFunction() при нажатии. Те, которые имеют вызов в атрибуте onclick, представляют собой устаревшие страницы контента. Новые страницы имеют прикрепленное к ним событие jQuery click:

$(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) или аналогичный. Я не уверен, что это возможно, чтобы получить HREF внутри SomeFunction(), если только я, что хотя :(

+0

Моя скрипка работает, как вы просили. Мне пришлось модифицировать ваши блоки кода, но ТОЛЬКО, чтобы предотвратить попытку ссылки на самом деле, и чтобы соответствовать остальной части кода из-за отсутствующей ссылки ссылки в формате pdf. – Lazerblade

ответ

1

Так что пусть это кипятить на медленном огне в течение некоторого времени, и я придумал краткосрочного решения ... это довольно Hacky, и я чувствую своего рода грязный для делать это, но иногда просто нужно делать то, что вам нужно сделайте, пока вы не сможете сделать то, что вам нужно ... в любом случае, я отправляю свое уродливое решение для других, которые могут быть скопированы в аналогичный угол ...

Имейте в виду, что только код, разрешено касатьться в 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!***/ 

Так или иначе, да, это некрасиво, но, надеюсь, это может спасти чью-то задницу, если они отчаянно.

+0

Хорошая идея. Всего две настройки : 1. Уменьшите таймаут до 0. Вам [не нужно 200 мс] (http://ejohn.org/blog/how-javascript-timers-work/), и вам не хватает двойных щелчков. 2. Не сохраните href в 'someFunction.href', просто используйте переменную в общей области. – user123444555621

6

Вы ничего, кроме 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); 
    }); 
}); 
+0

OP сказал, что он не может коснуться функции щелчка. Он сказал, что должен сделать это в javascript, но без внесения изменений в верхние 2 раздела кода. – Lazerblade

+0

Не совсем понятно _exactly_, что не может быть изменено в коде jQuery. Если ничего нельзя изменить, это невозможно. –

+0

right ... Я ничего не могу изменить в кодовом блоке jQuery или вызове onclick .. поэтому я не могу просто выполнить 'someFunction (this);' Кроме того, я пробовал делать 'console.log (this.href);' внутри someFunction(), и он тоже дал мне «undefined» – slinkhi

1

Используйте либо this.href или более Jquery соответствующий $(this).attr('href'), чтобы получить значение каждой из ссылок.

+3

В этом случае абсолютно нет необходимости использовать '.attr()'. 'this.href' работает во всех браузерах и имеет лучшую производительность и значительно более кратким. http://stackoverflow.com/a/4652402/139010 –

+0

@ MDΓΓБДLL: У меня создалось впечатление, что «более старые» версии IE (хотя я не могу вспомнить * какие * версии) требовали 'this.getAttribute ('href') ', а не просто' this.href'? Извините, я не могу обеспечить поддержку этого понимания, хотя ... только одна из тех вещей, которые я так долго верила, я думаю. =/ –

+0

@DavidThomas Я могу ошибаться, так как я использую этот ответ в качестве ссылки, но не тестировал его сам (я запускаю OS X на работе и дома, а виртуальная машина просто не стоит усилий). –

0

Здесь вы идете. Попробуй это. Настройте соответствующим образом для своих нужд (я удалил ссылку на pdf, потому что в моей скрипке не было).

EDIT: Протестировано в FF и Chrome. Дай мне знать, если это сработает для тебя.

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

+0

Здравствуйте, Lazerblade: Я пошел к вашей ссылке (используя последнюю версию FF), и в журнале консоли появилось сообщение об ошибке« событие не определено » – slinkhi

+0

Да, Я тестировал в Chrome. Посмотрим, смогу ли я работать и в FF, дайте мне несколько минут. Нужно настроить. – Lazerblade

+0

AFAIK, 'window.event' не совместим с несколькими браузерами. Я удивлен, что он работает в чем-либо, кроме IE, и я серьезно сомневаюсь, что вы сможете когда-либо использовать 'window.event' в Firefox. –

4

Здесь в 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. 
Смежные вопросы