2014-09-16 2 views
0

я наткнулся на странное требование (устанавливается самостоятельно) ...HTML5 данных со сложным объектом JSON и JavaScript

Я создаю легко интегрировать AJAX контента загрузчик плагин с большим количеством опций и обратных вызовов. Поскольку загрузчик является классом, и разработчик может иметь несколько экземпляров на одной странице, я хотел избавиться от всего уродливого кода, необходимого для каждой инициализации, и решил вместо этого использовать атрибуты данных - они выглядят потрясающе и профессионально!

Вопрос: Как добавить функции и javascript вообще в атрибут данных?

Пример:

var url = "someurl/goes/here/"; 
var Template = new TemplateEngine('Name', { 
    onCreate: function(template, parts) { 
     // do something with template parts 
     template.ID += 1; 
    }, 
    onRender: function(template, parts) { 
     template.addClass('flash'); 
    } 
}); 
var settings = { 
    container: DOM_ELEMENT|STRING, 
    template: Template, 
    disableDefaultRender: true, 
    // a bunch of hooks and callbacks like this: 
    onBeforeRequest: function(loader, data) { 
     new_data = data; 
     // modify request data somehow 
     loader.requestData = new_data; 
    }, 
    onRender: function(loader, data) { 
     loader.renderData(data, function(part) { 
      // define specific rendering logic for different template parts 
      // in required 
     }); 
    }, 
    onAfterRequest: function(loader, data) { 
    }, 
    onError: function(loader, data) { 
    } 
    // etc, etc 
}; 
var THE_LOADER = new SuperFancyAjaxLoader(url, settings); 

Моя первоначальная идея заключается в том, чтобы как-то поставить все выше внутри указанного атрибута данных:

<div data-fancy-stuff="{all-or-most-of-the-above}">more stuff</div> 

и сделать сам скрипт найти все элементы и инициализировать экземпляры для каждого из них:

var elements = document.querySelector('[data-fancy-stuff]'); 
for(item in elements) { 
    try { 
     var data = elements[item].getAttribute('data-fancy-stuff'); 
     var THE_LOADER = new SuperFancyAjaxLoader(data.url, data.settings); 
    } catch (ex) { 
     console.log('Someone messed with prototypes'); 
    } 
} 

Идея помещения функций javascript внутри атрибут идиот? Или есть способ на самом деле поместить некоторые js внутри атрибута?

Я понимаю, что если требуется так много javascript, бессмысленно пытаться помещать его в атрибут, но в реальных случаях (для этой конкретной задачи) у меня будет 3-5 загрузчиков контента на странице, большая часть они (или все) будут использовать один и тот же шаблон и логику визуализации, но все они должны будут самостоятельно изменить данные запроса.

p.s. Eval - Зло.

Редактировать: Я открыт для разработки предложений, которые не связаны с внешними инфраструктурами MVC.

+0

Честно говоря, я бы посмотрел на то, что вы делаете.Я не понимаю, почему вы просто не ссылаетесь на методы в своих атрибутах 'data' и запускаете' window [elements [item] .getAttribute ('data-fancy-stuff)] 'вместо этого, пока вы делаете каждую функцию член окна или любой другой объект, который вы хотите. Вот как вы можете запустить строку. Но я никогда бы никогда не предлагал вводить кучу JavaScript внутри атрибутов HTML. – EHorodyski

+0

Я использовал этот подход пару лет назад, и он работает, но со временем он становится все более и более недружелюбным для поддержания. – Martin

+0

Тогда я думаю, что пришло время взглянуть на ваш код и попытаться его перестроить со всем уважением. – EHorodyski

ответ

0

Возможно, я не очень хорошо понимаю, но вы хотите предоставить некоторые модули/классы/объекты JavaScipt через атрибут HTML5 ???

Я думаю, что это плохой дизайн. Кажется, это смесь разных слоев.

Итак, технически U имеет только ОДНУ способность - вызвать eval даже после PS, потому что eval - единственная точка, где JavaScript может получить другой JavaScript из String - ТОЛЬКО.

Но если U хочет динамически загружать некоторые сложные javascript в качестве реакции на данные в некоторых элементах, это очень хорошая идея, чтобы изучить и применить наиболее совершенную вещь для таких сценариев - хорошо известную команду require.js http://requirejs.org/. И если вы хотите с трудом связать DOM с некоторыми данными и поведением, вы должны изучить некоторые из решений MVC JavaScript - AngularJS, Backbome, Amber и так далее.

По дизайну у вас нужно разделить приложение на уровень презентации, где DOM будет жить, и бизнес-уровень будет работать в JavaScript. Чтобы связать их друг с другом, вы используете дескрипторы строки/JSON в атрибуте DOM и динамически загружаете JavaScript с помощью перезаписи головы на лету или с помощью XHR + eval, такой дизайн является асинхронным, быстрым и является основным выбором всех надежных сетевых приложений из gmail для всех остальных крутых сотрудников. Чтобы помочь создать приложение с такой моделью - require.js является лучшим и наиболее известным помощником.

+0

Я уже использую require, но это не поможет мне предоставить объекты установки для моих экземпляров. Вы неправильно поняли мою идею, я уже разделил приложение на слои, потому что на данный момент у меня нет другого выбора. Моя цель - сделать большую часть логики управляемой атрибутами HTML. У меня нет возможности использовать любое решение MVC ... – Martin

+0

«Контроль из атрибутов» - это основной подход и функция ANY JavaScript MVC, потому что эта идея в мире DOM/JS является ТОЧНО, что такое MVC в HTML. Итак, теперь идите против ветра и пытайтесь воссоздать вещи, которые уже сделаны и работают (и все они основаны на eval, потому что теперь есть другие решения для строки javascript). Я думаю, что лучше взглянуть на AngularJS. Для меня это наиболее сбалансировано - у него есть функциональность и документ, но он не настолько абстрактен и не похож на хардхарт, а гораздо проще, понятен и просто запущен, чем янтарь. –

+0

В Угловом u определите элюмент со специальными атрибутами, например , а затем опишем MVC-движок, как вы хотите работать с ним с помощью "директивы" - Угловой динамически связывает эту функцию с сохранением объема и определения DOM источника. Это чистое решение HTML + Javasctipt, никаких специальных языков/переводчиков, необходимых для работы с ним. –

Смежные вопросы