Извлечь onclick location.href из объекта jquery в виде строки - PullRequest
1 голос
/ 03 апреля 2012

Я пытаюсь захватить элемент button, чтобы открыть его ссылку в новом окне. Я добавил новый атрибут - элементы, которые нужно открыть в новом окне с именем data-ext-link="true". В некоторых случаях элемент button имеет onclick, который содержит location.href, на который мне нужно отправить пользователя. Как я могу получить это location.href с помощью jquery, чтобы я мог передать его window.open в моей функции?

Функция, представленная ниже, прекрасно работает для якорных элементов, но она находится внутри моего оператора is('button') if, где она становится волосистой и не работает, потому что attr() возвращает объект, а не строку. Возвращаемый объект имеет следующий вид:

Код моей кнопки:

<button data-ext-link="true" onclick="location.href='http://website/url_i_want'" class="btn2">Open it up</button>

$. Attr ('onclick') Ответ:

function onclick(event) {
    location.href = "http://website.com/url_i_want";
}

Моя функция:

function extLinks() {
    var extLinks = $('a[data-ext-link="true"], button[data-ext-link="true"]');

    $.each(extLinks, function(){
        if($(this).is('button')){
            var link = $(this).attr('onclick'); // Here it needs to be a string.
            link = link.match(/location.href='(.*)'/); //Won't work because it's an object.
            link = link[1];
        } else {
            var link = $(this).attr('href');
        }
        $(this).unbind('click.extLink').bind('click.extLink',function(e){
            e.preventDefault();
            window.open(link);
        });
    });
}

UPDATE:

Я нашел следующий связанный вопрос, который предлагает использовать $.live, который устарел, я бы вместо этого использовал $.delagate(), но это не полностью решает проблему, где я должен сказать этой кнопке открыться в новом окне, используя это location.href значение внутри onclick в качестве цели.

РЕШЕНИЕ:

function extLinks() {
    var extLinks = $('a[data-ext-link="true"], button[data-ext-link="true"]');

    $.each(extLinks, function(){
        if($(this).is('button')){
            var link = this.onclick.toString().match(/location\.href\s*=\s*['"]([^'"]*)['"]/)[1];
        } else {
            var link = $(this).attr('href');
        }
        $(this).unbind('click.extLink').bind('click.extLink',function(e){
            e.preventDefault();
            window.open(link);
        });
    });
}

1 Ответ

0 голосов
/ 03 апреля 2012

Попробуйте преобразовать функцию в строку:

var link = $(this).attr('onclick').toString();

Примечание. Я не знаю, будет ли это работать во всех браузерах. У меня работает в Firefox и IE7, хотя.


Кроме того, вам может потребоваться пересмотреть ваше регулярное выражение - оно не будет работать для примера, который вы опубликовали. Попробуйте это:

/location\.href\s*=\s*['"]([^'"]*)['"]/

Я подтвердил, что это решение работает для меня. Вот пример страницы: http://nylen.tv/test-onclick.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...