Not able to input text in html text field
I have a script that makes me able to drag some content in a div.
But because you can drag around, no matter where you place the cursor in the div, I am not able to input some text in a text field.
Is it possible to allow that?
I can eaily click links in the div container. But not input text in a html input field.
This is the javascript:
$(document).ready(function () {
$('#roadmap').mousedown(function (event) {
$(this)
.data('down', true)
.data('x', event.clientX)
.data('scrollLeft', this.scrollLeft);
return false;
}).mouseup(function (event) {
$(this).data('down', false);
}).mousemove(function (event) {
if ($(this).data('down') == true) {
this.scrollLeft = $(this).data('scrollLeft') + $(this).data('x') - event.clientX;
}
}).mousewheel(function (event, delta) {
this.scrollLeft -= (delta * 30);
}).css({
'overflow': 'hidden',
'cursor': 'col-resize'
});
});
$(window).mouseout(function (event) {
if ($('#roadmap').data('down')) {
try {
if (event.originalTarget.nodeName == 'BODY' || event.originalTarget.nodeName == 'HTML') {
$('#roadmap').data('down', false);
}
} catch (e) { }
}
});
This is my extended mousewheel function (if needed)
(function ($) {
$.event.special.mousewheel = {
setup: function () {
var handler = $.event.special.mousewheel.handler;
// Fix pageX, pageY, clientX and clientY for mozilla
if ($.browser.mozilla)
$(this).bind('mousemove.mousewheel', function (event) {
$.data(this, 'mwcursorposdata', {
pageX: event.pageX,
pageY: event.pageY,
clientX: event.clientX,
clientY: event.clientY
});
});
if (this.addEventListener)
this.addEventListener(($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
else
this.onmousewheel = handler;
},
teardown: function () {
var handler = $.event.special.mousewheel.handler;
$(this).unbind('mousemove.mousewheel');
if (this.removeEventListener)
this.removeEventListener(($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
else
this.onmousewheel = function () { };
$.removeData(this, 'mwcursorposdata');
},
handler: function (event) {
var args = Array.prototype.slice.call(arguments, 1);
event = $.event.fix(event || window.event);
// Get correct pageX, pageY, clientX and clientY for mozilla
$.extend(event, $.data(this, 'mwcursorposdata') || {});
var delta = 0, returnValue = true;
if (event.wheelDelta) delta = event.wheelDelta / 120;
if (event.detail) delta = -event.detail / 3;
if ($.browser.opera) delta = -event.wheelDelta;
event.data = event.data || {};
event.type = "mousewheel";
// Add delta to the front of the arguments
args.unshift(delta);
// Add event to the front of the arguments
args.unshift(event);
return $.event.handle.apply(this, args);
}
};
$.fn.extend({
mousewheel: function (fn) {
return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
},
unmousewheel: function (fn) {
return this.unbind("mousewheel", fn);
}
});
})(jQuery);
And here goes the HTML
<div id="roadmap">
<ul>
<li class="roadmap_description">
<h2>Welcome</h2>
<p>Description</p>
</li>
<li><h3 cla开发者_开发问答ss="milestone_name">v. 1.0.2.3</h3>
<ul>
<li class="milestone_item"><a href="#">Title description</a></li>
</ul>
<div class="milestone_item_add">
<input class="field" name="milestone_item_name" type="text" /><a href="#"><img src="/Intranet/admin/Intranet/css/images/icons/wand.png" alt="Add new" /></a>
</div>
</li>
</ul>
</div>
Thank you.
The return false
in mousedown
prevents the mouse button press from having its default action, which is to focus the child <input>
.
You could test event.target
in the mousedown
function to see if it's the <input>
element, and if so just stop trying to handle it (return
or return true
straight away).
If you wanted to still allow the element to be dragged when the mouse is in the <input>
, you could still return false
but manually call focus()
on the input in mousedown
. The disadvantage of that would be that the user couldn't use drags to select part of the text, as inputs would normally allow.
Why dont you add a mouseover event to the textfield that sets this: $(this).data('down', false); ?
精彩评论