JavaScript:如何从自定义上下文菜单

时间:2016-12-21 09:08:43

标签: javascript reference href element

手头的任务如下:在我的网页上,我打算包含一种报告错误的方法,应该从自定义上下文菜单中调用这些错误,以使事情变得更容易。 我想要实现的是使用已打开上下文菜单的元素的内容填写错误报告的特定字段。

现在,有问题的代码(添加了调用错误报告器的链接)如下:

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是从触发上下文菜单的事件中提取的元素引用。

当然,由于显而易见的原因,使用双引号传递的元素引用也不会这样做...

现在,如何将元素引用传递给错误报告器,以便在上下文菜单中使用引用元素的内容?如果有办法,我看不到。我想避免定义一个包含元素引用的全局变量...

编辑:可以通过封装函数来形成一个独特的命名空间来解决这个问题 - 然后定义一个命名空间全局变量,该变量采用已打开上下文菜单的实体。 随后调用错误报告器时,它可以从之前保存的元素中读取内容。

2 个答案:

答案 0 :(得分:1)

不是将href属性设置为需要评估的JavaScript代码,而是将单击处理程序绑定到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
});

注意:给出以大写字母开头的函数名称是非常规的。这通常仅针对构造函数。所以我建议将invokeReporter作为名称。

答案 1 :(得分:0)

作为一种可行的解决方法,整个处理程序可以包含在一个匿名函数中,然后在其中声明一个局部变量,该变量接受打开菜单的对象。 实际调用错误报告器时,它可以从先前记住的对象中获取任何信息。