Извлечь onclick location.href из объекта jquery в виде строки

Я пытаюсь угнать 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);
        });
    });
}

ОБНОВИТЬ:

Я нашел следующий связанный вопрос, который предлагает использовать $.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 ответ

Решение

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

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

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


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

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

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

Другие вопросы по тегам