【问题标题】:Disable href, do some ajax stuff, re-enable href禁用href,做一些ajax的东西,重新启用href
【发布时间】:2014-11-11 10:41:30
【问题描述】:

问题来了:

我有一个标签,当我点击它时,我的 href 值会出现一个弹出窗口(fancybox),

<a class="myIdentifier" href="#myPopup">pop</a>

但是,当我点击它时,我必须使用 ajax 做一些事情来将字段更新到我的弹出窗口中......在它出现之前!

$("body").on('click','.myIdentifier',function(event){
    //DO SOME AJAX AND FILL MY POPUP FIELDS
});

所以这个 ajax 东西必须在“href”用于调用弹出窗口之前完成......

我正在寻找一种方法在我执行 jquery 功能时禁用我的 href,然后重新启用它以使弹出窗口出现...

谢谢

编辑/更新 ::

嗯,谢谢你的所有回答,但是,看看这个:

<a class="btn btn-warning editImp" href="#editImpPopup" title="Edit" id="22">EDIT</a>
<a class="btn btn-warning editImp" href="#editImpPopup" title="Edit" id="32">EDIT</a>
<a class="btn btn-warning editImp" href="#editImpPopup" title="Edit" id="44">EDIT</a>

preventDefault() 不起作用...看起来fancybox 不关心它...事件是用href 触发的...

我使用 jquery.fancybox.js,这是一个库,我不知道如何手动调用弹出窗口!我想我应该把这些a标签变成其他不响应fancybox代码的标签,应用我的ajax东西来填写表格,然后“手动生成”一个“点击带有“editImpPopup”的href设置的aa标签”.. .

但是怎么做??

谢谢!

(对不起我的英语,这不是我的母语......)

完整代码:

HTML(调用弹出窗口的链接):

<span class="linkhere">
    <a class="btn btn-warning editImp" href="#editImpPopup" title="Modifier" id="191-150">
        <i class="fa fa-edit"></i>
    </a>
</span>
<span class="linkhere">
    <a class="btn btn-warning editImp" href="#editImpPopup" title="Modifier" id="190-140">
        <i class="fa fa-edit"></i>
    </a>
</span>

JS(初始化fancybox):

$(".editImp").fancybox({
    type    :"inline",
    closeBtn :true
});

JS(on.click 函数,我在表单中填写我的输入):

$("body").on('click','.editImp',function(){

    var id=this.id;
    var tab = id.split('-');
    id = tab[0];
    var ets = tab[1];
    $.ajax({
        type : 'POST',
        url : './php/utils/getImpData.php',
        data : {'id':id},
        dataType : 'json',
        error : function(response){
            alert("ERROR GET IMPLANTATION DATA");
        },
        success : function(response){
            alert(JSON.stringify(response));
            $("#etsEditImp option").removeAttr('selected').filter("[value='"+ets+"']").attr('selected',true);
            $("#stageEditImp option").removeAttr('selected').filter("[value='"+response[0].stage+"']").attr('selected',true);
            $("#downEditImp option").removeAttr('selected').filter("[value='"+response[0].down+"']").attr('selected',true);
            $("#locEditImp option").removeAttr('selected').filter("[value='"+response[0].loc+"']").attr('selected',true);
            $("#nameEditImp").val(response[0].name);
            $("#streetEditImp").val(response[0].street);
            $("#numEditImp").val(response[0].num);
            $("#bEditImp").val(response[0].b);
            $("#prevStage").val(response[0].stage);
            $("#prevDown").val(response[0].down);
            $("#idImp").val(id);
            $("#prevEts").val(ets);
        }
    });
});

更新 2:

我试试这个...:

$(".editImp").fancybox({
    type    :"inline",
    closeBtn :true,
    beforeLoad : function(event){
        alert("TEST");
        var id=$(this).id;
        var tab = id.split('-');
        id = tab[0];
        var ets = tab[1];
        $.ajax({
            //...CODE
        });
    },
    onStart : function(){alert("TESTSTART");}
});

我收到此错误:id 未定义! 我无法将 id 恢复到这部分?

【问题讨论】:

  • @divakar:href 已经是一个哈希引用。并且点击事件被处理后将它改回来并不会真正做任何事情......
  • 你必须在完整的函数中手动调用fancybox才能进行ajax调用
  • 你如何初始化fancybox?我想说最好的方法是使用beforeLoad 回调...
  • @reyaner async: false 是一件坏事。
  • @reyaner 因为浏览器 UI 将挂起直到 Ajax 调用结束

标签: jquery ajax dom hyperlink href


【解决方案1】:

您可以保存第一次点击元素的事实(例如,使用类),以检查点击是用于发送 ajax 还是用于打开弹出窗口。

顺便提一下:.always() 用于测试。如果您只想在 ajax 成功时显示弹出窗口,则应改为 .done()

Fiddle.

JS:

$(document).ready(function()
{
    $('.myIdentifier').fancybox();

    $("body").on('click', '.myIdentifier', function()
    {
        var thisEl = $(this);
        if (!thisEl.hasClass("js-ajax_done"))
        { 
            $.ajax({ url: "incorrect_url"}).always(function()
            {
                $('#log').append("Ajax is done<br/>");
                $('#myPopup').text("Ajax data");
                thisEl.addClass("js-ajax_done");
                thisEl.click();
            });
            $('#log').append("End of first click (waiting for ajax)<br/>");
            return false;
        }
        $('#log').append("End of second click (ready to open popup)<br/>");
        thisEl.removeClass("js-ajax_done");
    });
});

HTML:

<a class="myIdentifier" href="#myPopup">pop1</a>
<a class="myIdentifier" href="#myPopup">pop2</a>
<a class="myIdentifier" href="#myPopup">pop3</a>
<div id="myPopup" style="display: none">Popup</div>

<div id="log"></div>

【讨论】:

  • 我终于看到了!让我们看看
  • @Julo0sS 我实际上已经删除了几分钟的答案以修复错误。然后我取消删除它。也许这就是你没有看到它的原因,即使它是在 58 分钟前发布的 :)
  • 这个类“ajax-done”是什么?我正在尝试编辑您的小提琴以将其与我的问题进行比较
  • @Julo0sS 我会在两个小时内回来。但正如我已经说过的,这个想法是在第一次点击时发送 ajax 请求,并在 ajax 成功时触发第二次点击(在解析 ajax 数据之后)。
  • @Julo0sS 我修复了你的小提琴中的错误并制作了很多 cmets 来帮助理解代码中发生的事情:updated fiddle。它基于小提琴版本 33,而不是版本 34(我还没有看到你的版本 34)。
【解决方案2】:

只需在完成 Ajax 后执行 event.preventDefault() 并调用弹出脚本即可。

$(document).on('click','.myIdentifier',function(event){
    event.preventDefault();
    showLoader();
    $.ajax({
       url: $(this).attr('href'),
       success: function(data){
          $('#someStuff').val(data);
          callPopup();
       }
    });
});

【讨论】:

  • 你知道怎么调用popup吗?
  • @Regent 取决于弹出窗口的类型。可以是简单的$('#popup').fadeIn()$('#popup').modal('show')
  • Fancybox 弹出窗口,如问题所述。
  • @Regent:我们可以在某个地方聊天吗?
【解决方案3】:

您首先如何/何时为目标元素初始化 FancyBox 插件?页面何时加载?

相反,也许初始化它以响应 AJAX 调用。看一下“手册 1”示例here。请注意,在页面的源代码中它不会立即初始化插件,而是仅在点击事件之后:

$("#manual1").click(function() {
    $.fancybox({
        // options
    });
});

您可能可以使用相同的结构来响应 AJAX 调用:

$("#yourElement").click(function() {
    $.ajax({
        // options
    }).done(function (response) {
        $.fancybox({
            // options
        });
    }).fail(function () {
        // handle error
    });
});

【讨论】:

  • 即使你会说“新手”之类的话..我会问,我该怎么办?我可以将我的代码发布到我的第一个问题中吗?但是有很多行...如果我必须发布我的ajax查询+我的fancybox初始化+我的html...很多行...
  • @Julo0sS:发布您的所有代码不太可能特别有用。尽管如果您的代码中有任何特定部分会改变或使我的答案(或任何其他答案)无效,那么这将值得包含在问题中。我的回答具体有什么不清楚的地方?我所做的只是处理点击事件、执行 AJAX 调用和初始化 FancyBox 插件。您已经在自己的代码中完成了所有这些事情,只是顺序不同。
【解决方案4】:

使用这个:

$("body").on('click','.myIdentifier',function(event){
    event.preventDefault();
    //DO SOME AJAX AND FILL MY POPUP FIELDS


    // on ajax success
    callPapup();

});

编辑

$( "#foo" ).trigger( "click" )改为callPopup()

【讨论】:

  • 它将在ajax调用返回和字段填充之前触发#foo
  • @Justinas 你想在提到的&lt;a&gt; 中添加id="foo" 吗?
  • .myIdentifier 不也是同一个元素吗?如果你再次触发同一个元素的点击,它不会再次这样做吗?
  • @David 如果 ID 应该被添加到相同的 &lt;a&gt; - 它会,是的。
  • @David 不,它不会...看看我更新的问题...我有几个具有相同类但 ID 不同的标签...该类用于触发事件,ID用于通过ajax获取数据...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 2020-11-21
  • 2012-12-06
  • 1970-01-01
相关资源
最近更新 更多