1

Я создаю расширение сафари. Когда пользователь щелкает правой кнопкой мыши по ссылке в сафари, он должен вызвать контекстное меню. Когда пользователь нажимает «Получить URL-адрес», он должен открыть щелчок по URL-адресу в новом окне. Я не могу понять, как получить URL! Он всегда открывается «не найден».Почему этот код не получает URL-адрес из Safari?

injected.js:

document.addEventListener('contextmenu', handleContextMenu, false); 

function handleContextMenu(event) 
{ 
    var target = event.target; 
    while(target != null && target.nodeType == Node.ELEMENT_NODE && target.nodeName.toLowerCase() != "a") 
    { 
     target = target.parentNode; 
    } 

    if(target.href) 
    { 
     safari.self.tab.setContextMenuEventUserInfo(event, target.href); 
    } 
    else 
    { 
     var foo = "href not found"; 
     safari.self.tab.setContextMenuEventUserInfo(event, foo); 
    } 
} 

Global.html:

<!DOCTYPE HTML> 
<script> 
var lastUrl; 

safari.application.addEventListener("contextmenu",handleContextMenu,false); 
safari.application.addEventListener('command', handleCommand, false); 

function handleContextMenu(event) 
{ 
    var query = event.userInfo; 
    lastUrl = query; 

    event.contextMenu.appendContextMenuItem("getUrl", "Get URL"); 
} 

function handleCommand(event) 
{ 
    if(event.command === 'getUrl') 
    { 
     if (lastUrl) 
     { 
      safari.application.openBrowserWindow().activeTab.url = lastUrl; 
     } 
     else 
     { 
      safari.application.openBrowserWindow().activeTab.url = "not found"; 
     } 
    } 
} 

</script> 

Как получить URL-адрес? Он всегда открывается «не найден».

ответ

0

Почему не просто var last url = event.userInfo в функции handleCommand? Пользовательская информация должна быть определена в этой точке, и должно быть более предсказуемо, чтобы попытаться установить значение в событии contextmenu.

+0

Не имеет значения - «не найден» по-прежнему является URL-адресом, который открывается. У меня нет опыта разработки расширений сафари, поэтому я просто ошибаюсь. –

+0

Просто, чтобы вы знали, этот фрагмент кода является важной частью гораздо большего супер полезного проекта. Если вы можете понять это, вы можете помочь мне решить проблему, которая может спасти людей бесчисленное количество часов! XD –

0

Я не понимаю, почему ваш код не работает, но есть несколько вещей, которые вы, возможно, захотите изменить в любом случае.

Во-первых, во вложенном скрипте контента, если нет target.href, не беспокойтесь о вызове safari.self.tab.setContextMenuEventUserInfo.

Во-вторых, в глобальном сценарии, измените handleContextMenu функцию следующим образом:

function handleContextMenu(event) { 
    if (event.userInfo) { 
     event.contextMenu.appendContextMenuItem("getUrl", "Get URL"); 
    } 
} 

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

В-третьих, как сказал Мэтт, вам не нужна глобальная переменная lastUrl, если только она не служит другим целям. Вы можете обратиться к event.userInfo непосредственно в handleCommand. И вам не нужно проверять, пуст ли он, потому что контекстное меню будет вставлено только handleContextMenu, если это не так.

function handleCommand(event) { 
    if (event.command === 'getUrl') { 
     safari.application.openBrowserWindow().activeTab.url = event.userInfo; 
    } 
} 

Надеюсь, это поможет.

+0

Я попробовал то, что вы сказали, и теперь «Получить URL» даже не отображается в контекстном меню. Я тестировал его с помощью простого файла html, содержащего только якорь в теле. –

+0

В этом случае в одном из скриптов должна быть некоторая ошибка. Вот расшифровка доказательной концепции, которая показывает, что код работает: https://dl.dropboxusercontent.com/u/23990/Canisbos/Nothing.safariextz - он ничего не отображает URL ссылки, когда вы выбираете Get URL в контекстном меню. Вы можете извлечь исходный код с помощью команды «xar -xf Nothing.safariextz». – canisbos

Смежные вопросы