Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当用户单击某个元素时:阻止默认操作,显示菜单,然后在单击菜单时恢复默认操作_Javascript_Jquery_Javascript Events - Fatal编程技术网

Javascript 当用户单击某个元素时:阻止默认操作,显示菜单,然后在单击菜单时恢复默认操作

Javascript 当用户单击某个元素时:阻止默认操作,显示菜单,然后在单击菜单时恢复默认操作,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,目标 当用户单击某个元素(使用class=“menu”)时,不应执行默认操作。应向用户提供带有选项的菜单。单击某个选项后,应执行默认操作 问题 首先停止最初的点击事件是非常有问题的,因为在那之后似乎不可能恢复“默认行为”——有没有办法将事件延迟到用户点击菜单项为止 示例 我希望发生的事情:单击链接。菜单将附加到正文中。单击菜单选项。现在执行原始单击的默认行为(这意味着触发原始单击链接的单击事件并重定向到example.com) jsFiddle HTML、JS和CSS在此处: PS:如果你想知

目标

当用户单击某个元素(使用class=“menu”)时,不应执行默认操作。应向用户提供带有选项的菜单。单击某个选项后,应执行默认操作

问题

首先停止最初的点击事件是非常有问题的,因为在那之后似乎不可能恢复“默认行为”——有没有办法将事件延迟到用户点击菜单项为止

示例

我希望发生的事情:单击链接。菜单将附加到正文中。单击菜单选项。现在执行原始单击的默认行为(这意味着触发原始单击链接的单击事件并重定向到example.com)

jsFiddle

HTML、JS和CSS在此处:


PS:如果你想知道我需要这些功能做什么,这里有一些关于我心目中的应用程序的草率而糟糕的想法:www.scribd.com/doc/39573220/MyJsApp这是不可能的;您需要在代码中模拟默认行为


您可以将
location.href
设置为链接的
href

这很容易实现,请查看以下内容:

//为单击链接的url创建容器
var事件\u href={};
功能创建菜单(选项){
$ul=$(“
    ”); $ul.append(“
  • ”+options.header+”
  • ); 对于(var$i=0;$i'+options.choices[$i]+''); } 返回$ul; } 函数resumeClick(){ window.location.href=事件; } $('.menu')。单击('click',函数(e){ //保存事件数据 event_href=e.currentTarget.href; e、 预防默认值() $('#占位符ul')。删除(); 创建菜单({ 标题:“选择某物”, 选项:[‘项目1’、‘项目2’、‘项目3’] }).appendTo(“#占位符”); //在具有回调==恢复函数的菜单项上初始化侦听器 $('.menu项')。单击('click',函数(){ 恢复单击();}) });
    1。为什么这不可能?在让最初的点击事件发生之前,当然可以做一些事情。2.您的解决方案不会触发可能触发其他内容的本机单击事件。3.我宁愿不要尝试模拟行为,也不要为每种类型的元素触发所有适当的事件。Link=native单击+follow href。文本字段=本机单击+焦点。不断地。让最初的事件通过要好得多。@arex:1:事实并非如此。如果不冻结整个浏览器,则无法使单击处理程序阻塞。2.我意识到这一点。可以使用jQuery引发事件。3.你需要写很多代码。
    // create container for url of clicked link 
    var event_href = {};
    
    function createMenu(options) {
        $ul = $('<ul></ul>');
        $ul.append('<li class="menu-header">'+options.header+'</li>');
        for (var $i = 0; $i < options.choices.length; $i++) {
            $ul.append('<li class="menu-item">'+options.choices[$i]+'</li>');
        }
        return $ul;
    }
    
    function resumeClick(){
        window.location.href = event_href;
    }
    
    $('.menu').click('click', function(e) {
        // save event data
        event_href = e.currentTarget.href;
        e.preventDefault()
            $('#placeholder ul').remove();
        createMenu({
            header: 'Choose something',
            choices: ['Item 1', 'Item 2', 'Item 3']
        }).appendTo('#placeholder');
        // init listeners on menu items with callbacks == resume function
        $('.menu-item').click('click', function(){
        resumeClick();})
    });