2010-06-10 5 views
-2

Я читал немного о ненавязчивым JS и как создать его и все, что джаз ...Генерация ненавязчивый JS

Моя проблема заключается в следующем: У меня есть сайт, который в значительной степени опирается на mod_rewrite, поэтому в основном все запросы страниц отправляются на index.php, который генерирует основную структуру страницы, а затем включает соответствующую страницу. Теперь на сайте есть разные разделы, и в каждом разделе используются разные функции Javascript (например, для разных запросов AJAX).

Теперь, если бы я просто должен был подключить функцию к onload страницы, очевидно, что это не сработает, поскольку мне не нужно инициализировать одни и те же вещи для каждой страницы ... так что лучший способ справиться с этой ситуацией?

Я надеюсь, что ситуация ясна, я буду рад, если это необходимо уточнить

+0

В общем, похоже, что у вас есть хорошие цели рефакторинга, если у вас слишком много функций для выполнения запросов ajax. Я имею тенденцию иметь 1 функцию многократного использования для генерации запросов ajax, которая принимает функцию для обратного вызова и объекта конфигурации для конкретных сообщений об ошибках, url и полезной нагрузке и т. Д. – unomi

+0

@unomi: Да, конечно, я имел в виду, что я делаю разные AJAX призывает делать разные вещи. Все они вызываются с одинаковой функцией, но они запрашивают различный контент в зависимости от страницы. – nico

+0

Downvoter, пожалуйста, не могли бы вы прокомментировать downvote? Прямо сейчас, похоже, что вы случайный тролль с нисходящим движением. – nico

ответ

1

Nico, я бы предложил создать пользовательский код javascript с каждой включенной страницей (неважно, где на странице вы включаете тег скрипта), и, как предположил Мэтью, после того, как вы определите функцию, выполняемую при загрузке страницы, использовать addEventListener чтобы загрузить пользовательскую функцию на «нагрузки»
Допустим, вы определяете функцию pageinit() где-то в теле прилагаемого документа

function pageinit(){.. 
} 
window.addEventListener("load", function() { pageinit(); }, false); 

это имеет смысл для вашего проекта?

+0

Да, это имеет смысл, я имел в виду что-то подобное, просто хотел посмотреть, есть ли какие-либо другие варианты, прежде чем начинать изменять весь код :) – nico

+0

вы можете определить каждую отдельную функцию JS для каждой включенной страницы, чтобы вы не загружаете другие, которые вы не будете использовать, но вы также можете связать их все и включить в качестве внешнего js-файла в разделе head вашего index.php, а затем просто вызвать addEventListener с соответствующим именем функции в каждом включенном страница – Raine

+0

есть, конечно, другие варианты, но не такие эффективные, как обсуждаемые здесь. – Raine

3

Вы можете использовать addEventListener (стандарт) или attachEvent в HTML, порожденный вспомогательных PHP страниц.

Синтаксис прост. Например.

document.addEventListener("load", someFunction, false); 

Это позволяет сгенерировать полный тег тела в index.php, но запускать разные обработчики нагрузки для каждой страницы. Также обратите внимание, что вы можете использовать это несколько раз для одного и того же элемента.

+0

Итак, по сути, у меня бы был вызов 'addEventListener' на каждой из страниц PHP, а затем несколько функций, которые делают разные вещи в зависимости от страницы, не так ли? – nico

+0

Да. Если это более удобно, вы можете иметь несколько вызовов 'addEventListener'. –

1

Я бы просто положил его в файл .js.

mysite_common.js - сайт широко распространенные утилиты и функции

mysite_page_a.js - уникальная функциональность для пролистывать

mysite_page_b.js - уникальная функциональность для страницы б

для страницы б включаемых б .js, а на странице a вы должны указать a.js

Тогда в ваших соответствующих unique.js вы можете объединить свои функции в ondomready или аналогично.

Держите его отдельно от вашего PHP, тогда это гораздо меньше раздражает позже, это также означает, что вы можете полагаться на кеширование для js, чтобы ваша страница загружалась более тонкой.

Вы также можете посмотреть такие вещи, как загрузчик YUI, который позволяет вам выполнять гораздо более сложные вещи, такие как ondemand загрузка бит функциональности js.

Вы можете использовать делегирование делегаций для обеспечения различных функциональных возможностей в зависимости от контекста.

В основном это работает, присоединяя прослушиватель событий к элементу контейнера, который захватывает клики по дочерним элементам.Затем вы можете покончить с отдельными слушателями событий, а также посмотреть подсказки от родителя. сказать:

<div id='container' class='page_a'> 
... 
    <input name='somename'> 
... 
</div> 

Тогда

var attachDelegates = function(container){ 
    container.onclick = function(e) { 
    e = e || window.event; 
    var t = e.target || e.srcElement; 

    //Your logic follows 
    if(t.name === 'somename'){ 
     dosomething(t); 
    } 
    if(t.className === 'someclass'){ 
     ... something else ... 
    } 
}; 

и onload = function(){attachDelegates('container');};

Функция attachDelegates может быть различным для каждой страницы, или вы могли бы иметь монолитную один и просто прикрепить подсказки к контейнеру или быть выборочно о том, какие классы вы присоединяете.

Это гораздо более когерентным объяснения и примеры:
http://cherny.com/webdev/70/javascript-event-delegation-and-event-hanlders
http://blog.andyhume.net/event-delegation-without-javascript-library

Лично я использую YUI3 http://developer.yahoo.com/yui/3/examples/node/node-evt-delegation.html

, поскольку это дает мне CSS3 селекторов стиля и довольно хлопот бесплатно до сих пор.

+0

Ну, у меня уже есть отдельные JS-файлы, как вы предложили, так что это уже сделано. То, что я хотел бы изменить, «просто», что прямо сейчас события определены в строке (например, ), а не прикрепляются при загрузке страницы. – nico

+0

Тогда похоже, что вы задаете неправильный вопрос :) Посмотрите на 'деле делегирование' fx: http://blog.andyhume.net/event-delegation-without-javascript-library или http: // разработчик .yahoo.com/yui/3/examples/node/node-evt-delegation.html, тогда вам не обязательно будет заботиться о том, какую страницу вы загружаете, вы нацеливаете свои действия с использованием классов css. – unomi

+0

Благодарим вас за ответ. Я понимаю вашу точку зрения о делегировании, я пытаюсь решить, какой из них будет более легким. В любом случае, спасибо всем за ответы, хорошо видеть разные способы сделать то же самое. – nico