Вот функция, которая помогает вам проверить, находится ли мышь внутри элемента или нет. Единственное, что вам нужно сделать, - это вызвать функцию, в которой вы можете связать объект EventObject, связанный с ядром. что-то вроде этого:
$("body").mousemove(function(event){
element_mouse_is_inside($("#mycontainer", event, true, {});
});
Вы можете увидеть исходный код здесь в github или в нижней части сообщения:
https://github.com/mostafatalebi /ElementsLocator/blob/master/elements_locator.jquery.js
function element_mouse_is_inside (elementToBeChecked, mouseEvent, with_margin, offset_object)
{
if(!with_margin)
{
with_margin = false;
}
if(typeof offset_object !== 'object')
{
offset_object = {};
}
var elm_offset = elementToBeChecked.offset();
var element_width = elementToBeChecked.width();
element_width += parseInt(elementToBeChecked.css("padding-left").replace("px", ""));
element_width += parseInt(elementToBeChecked.css("padding-right").replace("px", ""));
var element_height = elementToBeChecked.height();
element_height += parseInt(elementToBeChecked.css("padding-top").replace("px", ""));
element_height += parseInt(elementToBeChecked.css("padding-bottom").replace("px", ""));
if( with_margin)
{
element_width += parseInt(elementToBeChecked.css("margin-left").replace("px", ""));
element_width += parseInt(elementToBeChecked.css("margin-right").replace("px", ""));
element_height += parseInt(elementToBeChecked.css("margin-top").replace("px", ""));
element_height += parseInt(elementToBeChecked.css("margin-bottom").replace("px", ""));
}
elm_offset.rightBorder = elm_offset.left+element_width;
elm_offset.bottomBorder = elm_offset.top+element_height;
if(offset_object.hasOwnProperty("top"))
{
elm_offset.top += parseInt(offset_object.top);
}
if(offset_object.hasOwnProperty("left"))
{
elm_offset.left += parseInt(offset_object.left);
}
if(offset_object.hasOwnProperty("bottom"))
{
elm_offset.bottomBorder += parseInt(offset_object.bottom);
}
if(offset_object.hasOwnProperty("right"))
{
elm_offset.rightBorder += parseInt(offset_object.right);
}
var mouseX = mouseEvent.pageX;
var mouseY = mouseEvent.pageY;
if( (mouseX > elm_offset.left && mouseX < elm_offset.rightBorder)
&& (mouseY > elm_offset.top && mouseY < elm_offset.bottomBorder) )
{
return true;
}
else
{
return false;
}
}
То, что Вы сказали, корректно. Однако существует больше к нему, чем это.
, Если у Вас есть класс Klazz
и модуль Mod
, включая Mod
в Klazz
, приводит примеры Klazz
доступ к Mod
методы. Или можно расшириться Klazz
с Mod
предоставление доступ класса Klazz
к Mod
методы. Но также и можно расширить произвольный объект с помощью [1 110]. В этом случае отдельный объект добирается Mod
методы даже при том, что все другие объекты с тем же классом как [1 112] не делают.
Это корректно.
Негласно, включайте, на самом деле псевдоним для append_features, который (из документов):
реализация по умолчанию Ruby должна добавить константы, методы и переменные модуля этого модуля к aModule, если этот модуль не был уже добавлен к aModule или одному из его предков.
Когда Вы include
модуль в класс, методы модуля импортируются как [1 125] методы экземпляра .
Однако, когда Вы extend
модуль в класс, методы модуля импортируются как [1 127] методы класса .
, Например, если у нас есть модуль Module_test
определенный следующим образом:
module Module_test
def func
puts "M - in module"
end
end
Теперь, для [1 128] include
модуль. Если мы определяем класс A
следующим образом:
class A
include Module_test
end
a = A.new
a.func
вывод будет: M - in module
.
, Если мы заменяем строку include Module_test
extend Module_test
и выполняем код снова, мы получаем следующую ошибку: undefined method 'func' for #<A:instance_num> (NoMethodError)
.
Изменение вызова метода a.func
к [1 112], вывод изменяется на: M - in module
.
От вышеупомянутого выполнения кода, ясно что, когда мы include
модуль, его методы становятся методы экземпляра и когда мы extend
модуль, его методы становятся методы класса .