Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   bind передача event и this одновременно (https://javascript.ru/forum/misc/56273-bind-peredacha-event-i-odnovremenno.html)

Siend 07.06.2015 21:03

bind передача event и this одновременно
 
Подскажите пожалуйста, можно ли передать одновременно и параметр eventMouse и нужный мне контекст?
Поясню:
//1
MyElement.ondrop = this.MyFunction

function MyFunction(e){
   console.log(e) // EventMouse
}

//2
MyElement.ondrop = this.MyFunction.bind(this)

function MyFunction(e){
   console.log(e) // Нужный мне контекст
}

А как мне сделать так, чтобы получить сразу и контекст и переменную события?

pornoborets 07.06.2015 21:33

пробросить явно его
<html>
<head>
</head>
<body>

<p id="p1" foo="bar">foo</p>
<p id="p2" foo="bar">foo</p>

<script>

context1=function(){this.a=1}
context2={a: 10}

p1.onclick=function(e){with(new context1) with(this) {alert([e, a])}}
p2.onclick=function(e){with(context2) with(this) {alert([e, a])}}


</script>

</body>
</html>

Siend 07.06.2015 21:39

Но если я правильно понял, аргумент eventMouse вы так и не передали в функцию onclick

pornoborets 07.06.2015 21:46

Цитата:

Сообщение от Siend
Но если я правильно понял

Нет, неправильно поняли. Посмотрите на вывд алерт.(нажмите кропку запустить, и кликните по элементам)

Siend 07.06.2015 21:47

Спасибо огромное! То что нужно)

рони 07.06.2015 22:31

pornoborets,
Siend,
посмотрите код ниже, если он неправильный, как его правильно решить без with?
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>

<p id="p1" foo="bar">foo</p>
<p id="p2" foo="bar">foo</p>

<script>

var context1=function(){this.a=1}
var context2={a: 10}
var fn = function(e){alert([e,this.a, e.target])}
p1.onclick = fn.bind(new context1);
p2.onclick = fn.bind(context2);


</script>

</body>
</html>

pornoborets 07.06.2015 22:47

рони,
У тебя тут не связан контекст самого элемента.

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
 
<p id="p1" foo="bar">foo</p>
<p id="p2" foo="bar">foo</p>
 
<script>
 
var context1=function(){this.a=1}
var context2={a: 10}
var fn = function(e){try{alert(this.getAttribute("foo"))}catch(e){alert(e)}}
p1.onclick = fn.bind(new context1);
p2.onclick = fn.bind(context2);
 
 
</script>
 
</body>
</html>

тут вообще говоря, существует тьма чрезжопных решений, можно пропихивать кусками через замыкания, через call/apply/bind, только все это не нужно.

рони 07.06.2015 22:52

pornoborets,
а вы могли бы показать вариант без with?

pornoborets 07.06.2015 23:23

рони,
Я же говорю, нормальных решений я не вижу. Только кусковым методом. e.g.
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
 
<p id="p" foo="bar">foo</p>
 
<script>

p.onclick=function(o){
 return function(){alert([o.a, this.getAttribute("foo")])}
}({a: 1})
 
</script>
 
</body>
</html>

рони 07.06.2015 23:33

pornoborets,
ок, спасибо и за это!


Часовой пояс GMT +3, время: 03:09.