【问题标题】:jQuery Range Slider not working after Ajax call after updating jQuery to 1.10.2将 jQuery 更新到 1.10.2 后,jQuery Range Slider 在 Ajax 调用后不起作用
【发布时间】:2014-05-04 06:18:35
【问题描述】:

我正在开发一个 asp.net C# MVC Web 应用程序,并提供一个 jquery UI 价格范围过滤器来根据选定的价格范围过滤产品。生成的产品通过 Ajax 加载,到目前为止一切正常。但是,升级到 jQuery 版本 1.10.2 和 jQuery UI 1.10.3 后,相同的滑块在第一次加载时工作,但在 Ajax 请求后无法加载。以下代码在执行过滤器的页面上。

相同的代码在 jQuery 1.7.1 和 jQuery UI 1.10.0 上运行良好。

似乎在通过 Ajax 加载内容后滑块没有初始化,但不知道为什么!这里有什么问题?

$("#slider-range").slider({
    range: true,
    min: minValue,
    max: maxValue,
    values: [selectedMinValue, selectedMaxValue],
    values: [selectedMinValue, selectedMaxValue],
    slide: function (event, ui) {
        //Note: Currency Custom formatting is not supported.
        $(".currentMinPrice").html('@(Model.PriceRangeFilterContext.CurrencySymbol) ' + ui.values[0]);
        $(".currentMaxPrice").html('@(Model.PriceRangeFilterContext.CurrencySymbol) ' + ui.values[1]);


    },
    change: function (event, ui) {

        var url = removeParameter('@(currentURL)', "price");
        var newUrl = url.replace(/&amp/g, '');
        if (isAjaxRequest) {
            callAjax(UpdateQueryString("price", ui.values[0] + "-" + ui.values[1], newUrl));
        }
    }
});
isAjaxRequest = true;
$(".currentMinPrice").html('@(Model.PriceRangeFilterContext.CurrencySymbol) ' + $("#slider-range").slider("values", 0));
$(".currentMaxPrice").html('@(Model.PriceRangeFilterContext.CurrencySymbol) ' + $("#slider-range").slider("values", 1));
}

Ajax 函数

$.ajax(
{
    url: url,
    type: 'POST',
    success: function (result) 
    {   
        // Result is in html
        $('#catalog').replaceWith(result);
        $('#ajax-loading').hide();
        DisplayFilter();

        //Lazy Loading
        $("img.lazy").show().lazyload(
        {
            effect: "fadeIn"
        });
        $(window).trigger("scroll");
    }
});

【问题讨论】:

  • 我会尝试使用jQuery Migrate 只是为了了解它的工作原理,然后我可能会返回 jQuery 日志并查看有关 ajax 调用的更改,您可能会遗漏一些东西。 . jQuery UI 也一样(这里必须非常快,因为你有 1.10.0,现在只有 3 个版本)。
  • 您好,我们尝试使用 jQuery Migrate 但没有相关通知。我将检查 jQuery Logs
  • 请在您的问题中发布您的 Ajax 代码
  • @DaveA 使用 ajax 代码更新问题。请看一下。谢谢
  • 我会将您的代码包装在 try/catch 中并将错误转储到控制台(通过 console.log());这至少会告诉您是否发生了实际错误。

标签: c# javascript jquery ajax jquery-ui-slider


【解决方案1】:

我认为您需要在渲染滑块后对其进行初始化。您在初始渲染后创建的任何 DOM 元素都不会被您已运行的 javascript 初始化或绑定。

所以,首先将你的初始化封装在一个函数中:

function initSlider(passedMin, passedMax)
{
$("#slider-range").slider({
    range: true,
    min: passedMin,
    max: passedMax,
    values: [selectedMinValue, selectedMaxValue],
    values: [selectedMinValue, selectedMaxValue],
    slide: function (event, ui) {
        //Note: Currency Custom formatting is not supported.
        $(".currentMinPrice").html('@(Model.PriceRangeFilterContext.CurrencySymbol) ' + ui.values[0]);
        $(".currentMaxPrice").html('@(Model.PriceRangeFilterContext.CurrencySymbol) ' + ui.values[1]);


    },
    change: function (event, ui) {

        var url = removeParameter('@(currentURL)', "price");
        var newUrl = url.replace(/&amp/g, '');
        if (isAjaxRequest) {
            callAjax(UpdateQueryString("price", ui.values[0] + "-" + ui.values[1], newUrl));
        }
    }
});
isAjaxRequest = true;
$(".currentMinPrice").html('@(Model.PriceRangeFilterContext.CurrencySymbol) ' + $("#slider-range").slider("values", 0));
$(".currentMaxPrice").html('@(Model.PriceRangeFilterContext.CurrencySymbol) ' + $("#slider-range").slider("values", 1));
}

} 

然后在您的 AJAX 中,成功调用您的 init 函数

$.ajax(
{
    url: url,
    type: 'POST',
    success: function (result) 
    {   
        // Result is in html
        $('#catalog').replaceWith(result);
        $('#ajax-loading').hide();
        DisplayFilter();

        //Lazy Loading
        $("img.lazy").show().lazyload(
        {
            effect: "fadeIn"
        });
        $(window).trigger("scroll");

        initSlider(newMin, newMax)
    }
});

【讨论】:

  • 我已经尝试过这个并且这个工作。然而现在函数执行了,在 ajax 调用之后,传递给 slider() 的 min 和 max 变量中的值不会更新。它采用原始价格,从而破坏了功能。你能告诉我们如何解决这个问题吗?
  • @Krunal,那么我们应该重新编写函数以将 min 和 max 作为参数——我只是不确定数据应该来自哪里......结果?
  • @Krunal 考虑回传object: { htmlresult: html, minresult: minval, maxresult: maxval}。然后你可以将它们引用为result.html, result.minresult, result.maxresult
  • 我已经尝试过像你建议的那样传递值,但是它仍然没有更新声明的变量,不知道为什么!知道可能出了什么问题吗?
  • 我已经尝试过您建议的解决方案,我尝试在 Ajax 函数和调用滑块之前将值打印到警报中。但是,该值似乎在 ajax 之后的结果 html 中更新,但在传递给滑块的变量中并警告它仍然是较旧的值。我不确定为什么在 ajax 之后它仍然传递旧值!
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 2013-04-11
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
相关资源
最近更新 更多