【问题标题】:how to fix my JQuery bug?如何修复我的 JQuery 错误?
【发布时间】:2012-06-28 10:09:38
【问题描述】:

脚本在 jsfiddle 上:CODE

目前的作用:它是一种具有两种类型的 URL 字段 textarea 和 input 的表单,它将这些字段中的文本转换为可点击的链接。

工作原理:如果您点击链接旁边的链接,您可以编辑链接或双击链接。 如果您单击一次链接,它会将您带到该页面。

最后更新:我在最后一行添加了.trigger('blur');因为在我这样做之前,文本区域显示的链接就像一个合并的链接,例如:test.comtest2.com 显示 test.comtest2.com,在我添加了最后一次更新后,textera 的拆分也适用于页面加载,而不仅仅是 textarea 的编辑(它是在没有最后一次更新的情况下工作,但只有当您编辑 textarea 并在链接之间放置一个空格时,我希望它能够在页面加载时工作,因为 textarea 格式已经作为一个链接前行发送)。

我的问题:在我上次更新后,双击搞砸了,它应该只能编辑链接,除非单击,否则不会进入该页面,但是现在它会编辑它,并且在一秒钟内它也会进入该页面。 我想要双击只是为了编辑而不去那个页面。并且只需单击一下即可。

提前非常感谢!

代码也在这里:

$('.a0 a').click(function(){

var href = $(this).attr('href');

// Redirect only after 500 milliseconds
if (!$(this).data('timer')) {
   $(this).data('timer', setTimeout(function () {
      window.open(href, '_blank')
   }, 500));
}
return false; // Prevent default action (redirecting)});

$('.a0').dblclick(function(){
clearTimeout($(this).find('a').data('timer'));
$(this).find('a').data('timer', null);

$(this).parent().find('input,textarea').val($(this).find('a').text()).show().focus();
$(this).hide();})

$('.a0').click(function(){
       $(this).parent().find('input,textarea').val($.map($(this).find('a'),function(el){return $(el).text();}).join(" ")).show().focus();
$(this).hide();})

$('#url0, #url1,#url4').each(
function(index, element){
    $(element).blur(function(){
            var vals = this.value.split(/\s+/),
    $container = $(this).hide().prev().show().empty();

$.each(vals, function(i, val) {
    if (i > 0) $("<span><br /></span>").appendTo($container);
    $("<a />").html(val).attr('href',/^https?:\/\//.test(val) ? val : 'http://' + val).appendTo($container);;
});  })
}).trigger('blur');

【问题讨论】:

  • 在网页上混合单击和双击是一种注定失败的设计。即使你能让它正常工作,这也是一场可用性灾难。
  • 但它工作得很好,我只是想让 textarea 对链接有好处,在我添加 trigger() 之后,textarea 工作了,但双击现在不能正常工作......
  • 不,这行不通。对于使用平板电脑/手机的人来说,情况会更糟。
  • @Pointy,不,它在那个计时器上工作得非常好,并且在 click 和 dbclick 上工作得很好,但是 trigger() 破坏了它的工作......好吧,让我们以其他方式尝试,最后一部分脚本对 textarea 进行拆分以每行创建一个链接,但它仅在编辑操作时起作用,我怎样才能使该拆分在页面加载时完成?谢谢
  • 做你想做的;我只是在传达专业 Web 应用程序设计领域普遍接受的智慧和最佳实践。

标签: javascript jquery jquery-ui


【解决方案1】:

双击总是先于以下事件链:

mousedown, mouseup, click, mousedown, mouseup, click, dblclick

您可以让您的点击事件等待并检查之后是否发生了双击事件。 setTimeout 是你的朋友。请务必从传递给您的处理程序的event 对象中复制您需要的任何数据。该对象在处理程序完成后被销毁 - 这是在调用延迟处理程序之前


您可以手动调度双击事件以防止单击事件在它们之前执行。 See the Fiddle

// ms to wait for a doubleclick
var doubleClickThreshold = 300;
// timeout container
var clickTimeout;
$('#test').on('click', function(e) {
    var that = this;
    var event;

    if (clickTimeout) {
        try {
            clearTimeout(clickTimeout);
        } catch(x) {};

        clickTimeout = null;
        handleDoubleClick.call(that, e);
        return;
    }

    // the original event object is destroyed after the handler finished
    // so we'll just copy over the data we might need. Skip this, if you
    // don't access the event object at all.
    event = $.extend(true, {}, e);
    // delay click event
    clickTimeout = setTimeout(function() {
        clickTimeout = null;
        handleClick.call(that, event);
    }, doubleClickThreshold);

});

function handleClick(e) {
    // Note that you cannot use event.stopPropagation(); et al,
    // they wouldn't have any effect, since the actual event handler
    // has already returned
    console.log("click", this, e);
    alert("click");
}

function handleDoubleClick(e) {
    // this handler executes synchronously with the actual event handler,
    // so event.stopPropagation(); et al can be used!
    console.log("doubleclick", this, e);
    alert("doubleclick");
}

【讨论】:

  • 你能在 jsfiddle 上做一个演示,看看你的答案是否像我想要的那样工作吗?谢谢!
  • 今晚我必须回复你。现在要去开会了。对不起。总体思路很简单,所以应该有人能给你一些演示代码……
  • 好的,好的,请回复我,因为我看到没有人在回答我也不知道,非常感谢!
  • jsfiddle.net/xEYdU/1 - 不过,您应该认真升级到当前版本。
  • jsfiddle.net/xEYdU/2 - 真的不难,下次先试试自己的东西;)
【解决方案2】:

jsfiddle 出于某种原因拒绝加载我的连接,所以看不到代码。 根据您的解释,我建议您查看event.preventDefault 以增加对点击事件应该发生的事情的更多控制。这可以与@rodneyrehm 的回答结合使用。

【讨论】:

  • 我用代码更新了答案,因为 jsfiddle 不起作用,非常感谢您的注意
【解决方案3】:

参考我之前的answer

为了您的快速参考,我已将我的答案粘贴在这里

$('.a0 a').click(function(){
    var href = $(this).attr('href');

    // Redirect only after 500 milliseconds
    if (!$(this).data('timer')) {
        $(this).data('timer', setTimeout(function() {
            window.open(href, '_blank')
        }, 500));
    }
    return false; // Prevent default action (redirecting)
});

$('.a0').dblclick(function(){
    var txt = document.createElement('div');
    $.each($(this).find('a'), function(i, val) {
        clearTimeout($(val).data('timer'));
        $(val).data('timer', null);
        $(txt).append($(val).text()); 
        $("<br>").appendTo(txt);
    });
    var content = $(this).parent().find('input,textarea');
    var text = "";
    $.each($(txt).html().split("<br>"), function(i, val) {
        if (val != "")
            text += val + "\n"; 
    });
    $(content).html(text);
    $(this).hide();
    $(content).show().focus();
})


$('#url0, #url1, #url4').each(function(index, element) {
    $(element).blur(function(){
        if ($(this).val().length == 0)
            $(this).show();
        else
        {
            var ele = this;
            var lines = $(ele).val().split("\n");
            var divEle = $(ele).hide().prev().show().empty();
            $.each(lines, function(i, val) {
                $("<a />").html(val).attr({
                    'href': val, 
                    'target': '_blank'}).appendTo(divEle);
                $("<br/>").appendTo(divEle);
            });
        }
    });
});
​

【讨论】:

  • 您知道每个 blur() 事件都会杀死并重新创建 .a0 中的所有 &lt;a&gt; 吗?因此,您在第 1 行注册的点击处理程序不再存在(在新创建的元素上)。因此,在您编辑了一次链接块后,您将无法再次双击链接。
  • 我看到了你的代码/演示,这就是我首先发表评论的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 2021-10-15
相关资源
最近更新 更多