2016-12-21 6 views
0

Задача заключается в следующем: на моей веб-странице я намерен включить средство сообщения об ошибках, которые предполагается вызывать из настраиваемого контекстного меню, чтобы сделать что-то Полегче. Что я хочу достичь, это заполнение определенного поля отчета об ошибке содержимым элемента, на котором было открыто контекстное меню.JavaScript: как передать ссылку на объект из настраиваемого контекстного меню

Теперь код в вопросе (который добавляет ссылку для вызова репортера ошибки) является следующее:

function ReporterContext(p_menu, p_context, p_elem, p_prestage) 
    { 
var l_listitem; 
var l_link; 
var l_text; 
var l_lang = document.children[0].attributes['xml:lang'].value; 
var l_section; 

    if(!p_prestage) 
    { 
    switch(p_context) 
     { 
     case 'link': 
     case 'ext-link': 
     l_section = 'link'; 
     break; 

     default: 
     l_section = 'misc'; 
     } 

    l_listitem = document.createElement('li'); 
    l_link = document.createElement('a'); 
    l_link.setAttribute('href', 'javascript:void(InvokeReporter());'); // Object reference supposed to be added here   
    l_text = document.createTextNode(err_outtext[l_section][l_lang]['report']); 
    l_link.appendChild(l_text); 
    l_listitem.appendChild(l_link); 
    p_menu.appendChild(l_listitem); 
    } 
    } 

Этой функция связана в целом магии контекстного меню при загрузке страницы (это вызывается всякий раз, когда открывается контекстное меню), и с помощью вышеуказанного кода открывается репортер ошибок, хотя и без возможности автоматического заполнения текста, содержащегося в элементе, в котором было открыто контекстное меню. Однако, когда я изменить настройки HREF атрибута линии, чтобы передать ссылку элемента, как это, я получаю ошибку синтаксиса на консоли:

l_link.setAttribute('href', 'javascript:void(InvokeReporter(' + p_elem + '));'); 

p_elem является опорным элементом, извлеченный из события, которое инициировало контекстное меню ,

Конечно, имея опорный элемент передается в двойных кавычках не будет делать это, либо, по понятным причинам ...

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

EDIT: проблема может быть решена путем инкапсуляции функции для формирования отдельного пространства имен, а затем определить глобальную переменную пространства имен, которая принимает объект, на котором открыто контекстное меню. При вызове репортера ошибок он может считывать содержимое из ранее сохраненного элемента.

ответ

0

В качестве жизнеспособного обходного пути весь обработчик может быть обернут анонимной функцией, а затем объявить локальную переменную в нем, которая принимает объект, по которому было открыто меню. Когда репликатор ошибок фактически вызывается, он может принимать любую информацию из объекта, который ранее был запомнен.

1

Вместо того, чтобы устанавливать свойство href кода JavaScript, который необходимо оценить, привяжите обработчик click к l_link.

Таким образом, вместо этого:

l_link.setAttribute('href', 'javascript:void(InvokeReporter(' + p_elem + '));'); 

... это сделать:

l_link.setAttribute('href', '#'); // this is just to give it the hyperlink style 
l_link.addEventListener('click', function() { 
    InvokeReporter(p_elem); 
    return false; // to cancel the default hyperlink behaviour 
}); 

NB: Это нетрадиционный предоставляет функции, имена которых начинаются с заглавной буквы. Обычно это делается только для конструкторов. Поэтому я бы предложил invokeReporter как имя.

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