анонимная функция, переданная из PHP и установленная ссылка `this` - PullRequest
0 голосов
/ 13 июня 2009

У меня есть класс PHP со статической функцией:

<? echo view::getUserSelector() ?>

Какие выходы:

<div id="user_selector">
    <div class="user">
        <h1>Username1</h1>
        <a href="javascript:selectUser(this);">select</a>
    </div>
    <div class="user">
        <h1>Username2</h1>
        <a href="javascript:selectUser(this);">select</a>
    </div>
</div>

Что мне нужно сделать, чтобы это стало возможным?:

<? echo view::getUserSelector(array('onSelect' => 'function() { alert(this.id); }')); ?>
  1. Как «добавить» значение onSelect как функцию div#user_selector?
  2. Как мне позвонить div#user_selector.onSelect() со ссылкой this как div#user_select?

Javascript:

function selectUser(anchor) {
    //remove all 'selected' classes from $user_selector child divs
    //add 'selected' class to parent div.user of anchor
}

1 Ответ

1 голос
/ 13 июня 2009

В функции PHP, где вы выводите все это, вы можете добавить это внутри тегов скрипта, что даст вам то, что вы хотите (из того, что я могу понять).

<script type="text/javascript>
var uSelect = document.getElementById('user_select');
uSelect.onSelect = function() {
    alert(this.id);
}

function selectUser(anchor) {
    //remove all 'selected' classes from $user_selector child divs
    //add 'selected' class to parent div.user of anchor
    uSelect.onSelect();
}
</script>

Но, еще один ресурс, на который я хотел бы обратить внимание: если вы хотите просто объявить функцию и хотите узнать, как назначить любой данный объект как «this» внутри нее, функции Javascript должны иметь методы <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/call" rel="nofollow noreferrer">call</a> и <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/apply" rel="nofollow noreferrer">apply</a>.

Например: вы можете попробовать что-то подобное.

<script type="text/javascript>
var onSelect = function() {
    alert(this.id);
}

function selectUser(anchor) {
    //remove all 'selected' classes from $user_selector child divs
    //add 'selected' class to parent div.user of anchor
    var node = anchor;
    while(node && node.parentNode) {
        if(node.getAttribute('id') == 'user_select') {
            //apply(thisRef, argsArray)
            //call(thisRef, arg1, arg2 [...])

            onSelect.apply(node);
            break;
        }
        node = node.parentNode;
    }
}
</script>
...