- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数,可以在按下键时进行 AJAX 调用,如果结果不为空,它会将其放入工具提示中。如果我停用它,一切都会按预期工作,但一旦启用 AJAX,它似乎就会在返回空变量和实际结果之间“切换”。
这是进行 AJAX 调用并激活工具提示的部分:
jQuery(document).ready(function() {
jQuery('.qty').keyup(function() {
var qty = jQuery(this).val();
var pid = jQuery(this).next().html();
var element = this;
jQuery.post('shopping_cart_ajax.php', {products_id: pid, products_quantity: qty}, function(data) {
if (data)
{
jQuery(element).tooltip();
jQuery(element).unbind('mouseenter mouseleave');
jQuery(element).tooltip('update', data);
jQuery(element).tooltip('show');
}
else
{
jQuery(element).tooltip('destroy');
}
});
});
});
还有插件本身:
(function($) {
var methods = {
//създаване на tooltip-а
init: function(options) {
//настройки по подразбиране
if (!options)
{
options = {
method: "hover", //метод за активация на tooltip-а по подразбиране (за момента има само hover опция)
color: "#dc143c" //цвят по подразбиране
};
}
return this.each(function() {
//намиране текста на tooltip-а
var tooltip_text = $(this).attr("tooltip");
//добавяне на тялото и стрелката
$(this).after('<div></div>');
$(this).after('<div class="tooltip_base">'+tooltip_text+'</div>');
switch (options.method)
{
case "hover":
methods.hover(this, options.color);
break;
}
});
},
//показване на tooltip-а при посочване с мишката
hover: function(object, color) {
$(object).hover(
function() {
methods.position(object, color);
$(object).next().next().fadeIn(); //показване на стрелката
$(object).next().fadeIn(); //показване на тялото
},
function() {
$(object).next().next().hide(); //скриване на стрелката
$(object).next().hide(); //скриване на тялото
}
);
},
//позициониране на tooltip-а
position: function(object, color) {
//намиране позицията на елемента, под който трябва да се появи tooltip-а
var offset = $(object).offset();
//намиране размерите на елемента
var parent_width = $(object).outerWidth();
var parent_height = $(object).outerHeight();
//намиране размерите на tooltip-а
var tooltip_width = $(object).next().outerWidth();
var tooltip_height = $(object).next().outerHeight();
//намиране вида на tooltip-а и начина на позициониране
var pos_tooltip_top;
var pos_tooltip_left;
var pos_arrow_top;
var pos_arrow_left;
var arrow_type;
if ($(object).hasClass("tooltip_top_center") == true)
{
pos_tooltip_top = offset.top-tooltip_height-5;
pos_tooltip_left = offset.left+(parent_width/2)-(tooltip_width/2);
pos_arrow_top = offset.top-5;
pos_arrow_left = offset.left+(parent_width/2)-5;
arrow_type = "tooltip_bottom_arrow";
}
else if ($(object).hasClass("tooltip_top_right") == true)
{
pos_tooltip_top = offset.top-tooltip_height-5;
pos_tooltip_left = offset.left+(parent_width/2)-12;
pos_arrow_top = offset.top-5;
pos_arrow_left = offset.left+(parent_width/2)-5;
arrow_type = "tooltip_bottom_arrow";
}
else if ($(object).hasClass("tooltip_top_left") == true)
{
pos_tooltip_top = offset.top-tooltip_height-5;
pos_tooltip_left = offset.left-tooltip_width+(parent_width/2)+12;
pos_arrow_top = offset.top-5;
pos_arrow_left = offset.left+(parent_width/2)-5;
arrow_type = "tooltip_bottom_arrow";
}
else if ($(object).hasClass("tooltip_bottom_center") == true)
{
pos_tooltip_top = offset.top+parent_height+5;
pos_tooltip_left = offset.left+(parent_width/2)-(tooltip_width/2);
pos_arrow_top = offset.top+parent_height;
pos_arrow_left = offset.left+parent_width/2-5;
arrow_type = "tooltip_top_arrow";
}
else if ($(object).hasClass("tooltip_bottom_right") == true)
{
pos_tooltip_top = offset.top+parent_height+5;
pos_tooltip_left = offset.left+(parent_width/2)-12;
pos_arrow_top = offset.top+parent_height;
pos_arrow_left = offset.left+parent_width/2-5;
arrow_type = "tooltip_top_arrow";
}
else if ($(object).hasClass("tooltip_bottom_left") == true)
{
pos_tooltip_top = offset.top+parent_height+5;
pos_tooltip_left = offset.left-tooltip_width+(parent_width/2)+12;
pos_arrow_top = offset.top+parent_height;
pos_arrow_left = offset.left+parent_width/2-5;
arrow_type = "tooltip_top_arrow";
}
else if ($(object).hasClass("tooltip_left") == true)
{
pos_tooltip_top = offset.top-(tooltip_height/2)+(parent_height/2);
pos_tooltip_left = offset.left-tooltip_width-5;
pos_arrow_top = offset.top-5+(parent_height/2);
pos_arrow_left = offset.left-5;
arrow_type = "tooltip_right_arrow";
}
else if ($(object).hasClass("tooltip_right") == true)
{
pos_tooltip_top = offset.top-(tooltip_height/2)+(parent_height/2);
pos_tooltip_left = offset.left+parent_width+5;
pos_arrow_top = offset.top-5+(parent_height/2);
pos_arrow_left = offset.left+parent_width;
arrow_type = "tooltip_left_arrow";
}
else
{
pos_tooltip_top = offset.top+parent_height+3;
pos_tooltip_left = offset.left+(parent_width/2)-(tooltip_width/2);
arrow_type = "tooltip_no_arrow";
}
//позициониране на тялото
$(object).next().css({
"top": pos_tooltip_top,
"left": pos_tooltip_left
});
//избиране на подходящата стрелка
$(object).next().next().addClass(arrow_type);
//позициониране на стрелката
$(object).next().next().css({
"top": pos_arrow_top,
"left": pos_arrow_left
});
if (color != "")
{
//задаване цвят на тялото
$(object).next().css({
"background-color": color
});
var tooltip_class = $(object).next().next().attr("class");
var arrow_color;
//задаване цвят на стрелката
switch (tooltip_class)
{
case "tooltip_top_arrow":
arrow_color = "transparent transparent "+color+" transparent";
break;
case "tooltip_bottom_arrow":
arrow_color = color+" transparent transparent transparent";
break;
case "tooltip_left_arrow":
arrow_color = "transparent "+color+" transparent transparent";
break;
case "tooltip_right_arrow":
arrow_color = "transparent transparent transparent "+color;
break;
}
$(object).next().next().css({
"border-color": arrow_color
});
}
},
//показване
show: function() {
$(this).next().next().fadeIn(); //показване на стрелката
$(this).next().fadeIn(); //показване на тялото
},
//скриване
hide: function() {
$(this).next().next().hide(); //скриване на стрелката
$(this).next().hide(); //скриване на тялото
},
//промяна на съдържанието на tooltip-а
update: function(content, color) {
if (!color)
{
color = "#dc143c";
}
$(this).attr({
"tooltip": content
});
$(this).next().html(content);
methods.position(this, color);
},
//изтриване на tooltip-а
destroy: function() {
if ($(this).next().hasClass('tooltip_base'))
{
$(this).removeAttr('tooltip');
$(this).next().next().remove();
$(this).next().remove();
$(this).unbind('mouseenter mouseleave');
}
}
};
$.fn.tooltip = function(method) {
if (methods[method])
{
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
}
else if (typeof method === 'object' || !method)
{
return methods.init.apply(this, arguments);
}
else
{
$.error('Method '+method+' does not exist on jQuery.tooltip');
}
};
})(jQuery);
最佳答案
我认为您的插件与您遇到的问题无关。
您的代码每次击键都会启动 Ajax 调用。
因此,在多次击键后,您会一个接一个地收到多个响应,其中一些可能为空,也可能不为空,这解释了您所看到的“切换”效果。
我假设您真正想要的是只处理最终的 Ajax 一次,仅在用户停止输入之后。或者换句话说,在任何给定时间“按目的”应该只有一个事件的 Ajax 请求。
因此,您需要引用初始 Ajax 调用,并在后续击键时中止它,然后启动一个新调用。
jQuery(document).ready(function() {
var xhr;
jQuery('.qty').keyup(function() {
var qty = jQuery(this).val();
var pid = jQuery(this).next().html();
var element = this;
// abort the Ajax request invoked by previous keystrokes
if (xhr) xhr.abort();
xhr = jQuery.post('shopping_cart_ajax.php', {products_id: pid, products_quantity: qty}, function(data) {
if (data)
{
jQuery(element).tooltip();
jQuery(element).unbind('mouseenter mouseleave');
jQuery(element).tooltip('update', data);
jQuery(element).tooltip('show');
}
else
{
jQuery(element).tooltip('destroy');
}
});
});
});
供您引用,.post()
返回一个 jqXHR 对象 (http://api.jquery.com/jQuery.post/) ,它公开了 abort()
方法 (http://api.jquery.com/jQuery.ajax/#jqXHR)
对于 Ajax 调用,尤其是那些通过悬停调用的调用,或者在您的情况下,是击键调用,这是我始终牢记的那种例程:即中止以前的 Ajax 调用。
关于javascript - jQuery 插件弄乱了 AJAX 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15781583/
在带有 jQuery 的 CoffeeScript 中,以下语句有什么区别吗? jQuery ($) -> jQuery -> $ - > 最佳答案 第一个与其他两个不同,就像在纯 JavaScr
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭13 年前。 Improve th
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
这个问题可能听起来很愚蠢,但请耐心等待,因为我完全是初学者。我下载了两个 jQuery 版本,开发版本和生产版本。我想知道作为学习 jQuery 的初学者,什么更适合我。 最佳答案 如果您对 jQue
The documentation说要使用 1.6.4,但我们现在已经升级到 1.7.2。 我可以在 jQuery Mobile 中使用最新版本的 jQuery 吗? 最佳答案 您当然可以,但如果您想
我在这里看到这个不错的 jquery 插件:prettyphoto jquery lightbox有没有办法只用一个简单的jquery来实现这样的效果。 我只需要弹出和内联内容。你的回复有很大帮助。
很明显我正在尝试做一些 jQuery 不喜欢的事情。 我正在使用 javascript 上传图片。每次上传图片时,我都希望它可见,并附加一个有效的删除脚本。显示工作正常,删除则不然,因为当我用 fir
这两个哪个是正确的? jQuery('someclass').click(function() { alert("I've been clicked!"); }); 或 jQuery('somec
我正在寻找一个具有以下格式的插件 if (jQuery)(function ($) { -- plugin code -- })(jQuery); 我明白 (function ($)
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭10 年前。 Improv
我知道这个问题已经被问过几次了,但想知道您是否可以帮助我解决这个问题。 背景:我尝试创建一个使用 Ajax 提交的表单(jQuery 表单提交)。我已经工作得很好,然后我想在表单上得到验证。我可以使用
我正在使用无处不在的jquery validate plugin用于表单验证。它支持使用metadata plugin用于向表单元素添加验证规则。 我正在使用此功能。当验证查找这些规则时,它会对元素进
我更喜欢为我一直在开发的网络社区添加实用的视觉效果,但随着事情开始堆积,我担心加载时间。 拥有用户真的更快吗加载(希望是缓存的)副本来自 Google 存储库的 jquery? 是否使用 jQuery
这个问题已经有答案了: Slide right to left? (17 个回答) 已关闭 9 年前。 你能告诉我有没有办法在 jQuery 中左右滑动而不使用 jQuery UI 和 jQuery
我如何找出最适合某种情况的方法?任何人都可以提供一些示例来了解功能和性能方面的差异吗? 最佳答案 XMLHttpRequest 是原始浏览器对象,jQuery 将其包装成一种更有用和简化的形式以及跨浏
运行时 php bin/console oro:assets:build ,我有 11 个这样的错误: ERROR in ../node_modules/jquery-form/src/jquery.
我试图找到 jQuery.ajax() 在源代码中的定义位置。但是,使用 grep 似乎不起作用。 在哪里? 谢谢。 > grep jQuery.ajax src/* src/ajax.js:// B
$.fn.sortByDepth = function() { var ar = []; var result = $([]); $(this).each(function()
我的页面上有多个图像。为了检测损坏的图像,我使用了在 SO 上找到的这个。 $('.imgRot').one('error',function(){ $(this).attr('src','b
我在理解 $ 符号作为 jQuery 函数的别名时遇到了一些麻烦,尤其是在插件中。你能解释一下 jQuery 如何实现这种别名:它如何定义 '$' 作为 jQuery 函数的别名?这是第一个问题。 其
我是一名优秀的程序员,十分优秀!