我有一个在鼠标输出时调用的函数。 它会检查元素现在是“拖动”还是正在编辑过程中。如果不是,它应该删除活动状态。
这就是它的样子。
function onMouseOut() {
console.log("mouse out");
if ($(this).find(".content").attr('data-editing') != "true" && $(this).find(".content").attr('data-dragging') != "true") {
console.log("no edit, no dragging");
removeActive($(this).find(".content"));
} else {
console.log("edit: " + $(this).find(".content").attr("data-editing"));
console.log("dragging: " + $(this).find(".content").attr("data-draging"));
}
}
该元素位于可排序的内部。它不会破坏上面的代码,我可以根据需要对其进行多次排序。但是,当我添加“connectWith”和移位发送者时,它完全中断了。
然后我输出到控制台如下:
mouse out
edit: undefined
dragging: undefined
现在,这怎么可能呢?
修改
好的是标记:
<div id="body">
<section class="main_1 grid_8 field" data-field='main_1'>
<div class='module'>
<div class="content content-editor" data-id='1' data-module='content' contenteditable='true'>
<h1>Heading 1</h1><p>"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."</p>
</div>
</div>
<div class='module'>
<div class="content content-editor" data-id='4' data-module='content' contenteditable='true'>
<h4>Yet another content</h4><p>This is yet another contentblock!</p>
</div>
</div>
</section>
<aside class="aside_1 grid_4 field" data-field='aside_1'>
<div class='module'>
<div class="content content-editor" data-id='2' data-module='content' contenteditable='true'>
<h2>Aside Content</h2><p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.</p>
</div>
</div>
</aside>
<div class="x-clear"></div>
</div>
这是js:
$(document).ready(function() {
/*
* - on hoover, we display the panel
*/
$( ".content-editor" ).mouseenter(onMouseIn);
$( ".edit-wrap" ).live("mouseleave", onMouseOut);
/*
* - on click/focus, we set it as active
*/
$( ".content-editor" ).focus(onFocus);
$( ".content-editor" ).blur(onLostFocus);
});
/*
* - functions
*/
function onMouseIn() {
if ($(this).attr('data-active') != "true" && !dragging) {
console.log("wasnt active: " + $(this).attr('data-active'));
makeActive($(this));
} else {
console.log("was active: " + $(this).data('id') + " - act: " + $(this).attr('data-active'));
}
}
function onMouseOut() {
console.log("mouse out");
if ($(this).find(".content").attr('data-editing') != "true" && $(this).find(".content").attr('data-dragging') != "true") {
console.log("no edit, no dragging");
removeActive($(this).find(".content"));
} else {
console.log("edit: " + $(this).find(".content").attr("data-editing"));
console.log("dragging: " + $(this).find(".content").attr("data-draging"));
}
}
function onFocus() {
$(this).attr('data-editing', 'true');
}
function onLostFocus() {
console.log("lost focus: " + $(this).data('id'));
}
function makeActive($this) {
$this.attr('data-active', "true");
$this.wrap("<div class='edit-wrap'>");
var $parent = $this.parent(".edit-wrap");
$parent.prepend("<div class='edit-head'>» Content ( Quick Edit )</div>");
$parent.append(editMenu);
}
function removeActive($this) {
$this.parent(".edit-wrap").find(".edit-head").remove();
$this.parent(".edit-wrap").find(".edit-menu").remove();
$this.unwrap(".edit-wrap");
$this.attr('data-active', "false");
}
/*
* - html
*/
var editMenu = "<div class='edit-menu'>"+
"<a href='#' class='btn openEditor'>Öppna Editor</a>"+
"<a href='#' class='btn quicksave'>Snabspara</a>"+
"</div>";
和
var dragging = false;
$(document).ready(function() {
/*
$( ".edit-head" ).live("mouseover", function() {
$(this).parent(".edit-wrap").draggable({
handle: ".edit-head",
revert: 'invalid'
});
});
$( ".edit-wrap" ).live("dragstart", function() {
$(this).find(".content").attr("data-dragging", "true");
});
$( ".edit-wrap" ).live("dragstop", function() {
$(this).find(".content").attr("data-dragging", "false");
removeActive($(this).find(".content"));
});
*/
$( ".field" ).sortable({
start: function(e, ui) {
ui.placeholder.height(ui.item.height());
$(this).find(".content").attr("data-dragging", "true");
dragging = true;
$(".field").addClass("target");
},
stop: function() {
$(this).find(".content").attr("data-dragging", "false");
dragging = false;
$(".field").removeClass("target");
},
connectWith: '.field',
placeholder: "drop-placeholder",
dropOnEmpty: true,
handle: ".edit-head",
update: function(e, ui) {
var $this = ui.item;
var $sender = ui.sender;
if ($sender) {
//vi bytte field
console.log("bytte");
} else {
console.log("bytte inte");
}
console.log("change: " + $this + " from: " + $sender);
}
});
});
答案 0 :(得分:1)
寻找拼写错误:
attr("data-draging")
以及代码中的其他位置
attr("data-dragging")
然而如上所述,请使用:
data("dragging")
答案 1 :(得分:0)
首先,我建议不要使用数据属性重载HTML,而是使用默认属性,例如id
和class
(例如,对于活动/拖动状态)。其次,当你一直使用$(this).find()
编写非常慢的代码时,你可以在jQuery中给出选择器的上下文,你也可以缓存你的对象/数据:var $content = $('.content', this);
。这使您的代码更清晰($(this).is('.active')
而不是检查数据活动字符串),甚至可能排除编码错误。
PS:如果你使用的是最近的jQuery版本,还要更新你的jQuery编码知识:)(例如阅读文档)
答案 2 :(得分:0)
我建议你继续使用你想要的数据属性,并保持class'es主要用于样式但是访问数据附带:
$selector.data("name")
方法而不是
$selector.attr("data-name")
答案 3 :(得分:0)
console.log("dragging: " + $(this).find(".content").attr("data-draging"));
错字,需要
console.log("dragging: " + $(this).find(".content").attr("data-dragging"));
这就是你在控制台中获得未定义的原因。
onMouseOut中的“data-editing”属性检查如果从未设置过,则可能是未定义的。我拖欠它是假的。您可能希望默认HTML元素中的值,或者您可能希望在if语句中检查undefined。
$( ".content-editor" ).attr('data-editing', 'false');
更改停止以获取事件和ui以及排序(e,ui)并将数据拖动attr ui.item(当前拖动项目)设置为false。
stop: function(e, ui) {
$(ui.item).find(".content").attr("data-dragging", "false");
$(this).find(".content").attr("data-dragging", "false");
它没有将你要拖动的元素设置为false,它似乎是为被转移到false的元素设置它。
进入“编辑模式”似乎仍有问题我不确定模糊是否正好处理此事件。当我有更多时间时,我会迟到。
现在全部:
$(document).ready(function() {
/*
* - on hoover, we display the panel
*/
$( ".content-editor" ).mouseenter(onMouseIn);
$( ".content-editor" ).attr('data-editing', 'false');
$( ".edit-wrap" ).live("mouseleave", onMouseOut);
/*
* - on click/focus, we set it as active
*/
$( ".content-editor" ).focus(onFocus);
$( ".content-editor" ).blur(onLostFocus);
});
/*
* - functions
*/
function onMouseIn() {
if ($(this).attr('data-active') != "true" && !dragging) {
console.log("wasnt active: " + $(this).attr('data-active'));
makeActive($(this));
} else {
console.log("was active: " + $(this).data('id') + " - act: " + $(this).attr('data-active'));
}
}
function onMouseOut() {
console.log("mouse out");
if ($(this).find(".content").attr('data-editing') != "true" && $(this).find(".content").attr('data-dragging') != "true") {
console.log("no edit, no dragging");
removeActive($(this).find(".content"));
} else {
console.log("edit: " + $(this).find(".content").attr("data-editing"));
console.log("dragging: " + $(this).find(".content").attr("data-dragging"));
}
}
function onFocus() {
$(this).attr('data-editing', 'true');
}
function onLostFocus() {
console.log("lost focus: " + $(this).data('id'));
//$(this).attr('data-editing', 'false');
}
function makeActive($this) {
$this.attr('data-active', "true");
$this.wrap("<div class='edit-wrap'>");
var $parent = $this.parent(".edit-wrap");
$parent.prepend("<div class='edit-head'>» Content ( Quick Edit )</div>");
$parent.append(editMenu);
}
function removeActive($this) {
$this.parent(".edit-wrap").find(".edit-head").remove();
$this.parent(".edit-wrap").find(".edit-menu").remove();
$this.unwrap(".edit-wrap");
$this.attr('data-active', "false");
}
/*
* - html
*/
var editMenu = "<div class='edit-menu'>"+
"<a href='#' class='btn openEditor'>Öppna Editor</a>"+
"<a href='#' class='btn quicksave'>Snabspara</a>"+
"</div>";
var dragging = false;
$(document).ready(function() {
/*
$( ".edit-head" ).live("mouseover", function() {
$(this).parent(".edit-wrap").draggable({
handle: ".edit-head",
revert: 'invalid'
});
});
$( ".edit-wrap" ).live("dragstart", function() {
$(this).find(".content").attr("data-dragging", "true");
});
$( ".edit-wrap" ).live("dragstop", function() {
$(this).find(".content").attr("data-dragging", "false");
removeActive($(this).find(".content"));
});
*/
$( ".field" ).sortable({
start: function(e, ui) {
ui.placeholder.height(ui.item.height());
$(this).find(".content").attr("data-dragging", "true");
dragging = true;
$(".field").addClass("target");
},
stop: function(e, ui) {
$(ui.item).find(".content").attr("data-dragging", "false");
$(this).find(".content").attr("data-dragging", "false");
dragging = false;
$(".field").removeClass("target");
},
connectWith: '.field',
placeholder: "drop-placeholder",
dropOnEmpty: true,
handle: ".edit-head",
update: function(e, ui) {
var $this = ui.item;
var $sender = ui.sender;
if ($sender) {
//vi bytte field
console.log("bytte");
} else {
console.log("bytte inte");
}
console.log("change: " + $this + " from: " + $sender);
}
});
});