Несколько лет спустя в настоящее время официально существует лучшее решение. DOM4 Mutation Observers заменяют устаревшие события мутации DOM3. Они , которые в настоящее время реализованы в современных браузерах как MutationObserver
(или как префикс поставщика WebKitMutationObserver
в старых версиях Chrome):
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(function(mutations, observer) {
// fired when a mutation occurs
console.log(mutations, observer);
// ...
});
// define what element should be observed by the observer
// and what types of mutations trigger the callback
observer.observe(document, {
subtree: true,
attributes: true
//...
});
В этом примере прослушивается DOM изменения на document
и все его поддерево, и оно будет срабатывать при изменении атрибутов элемента, а также структурных изменений. Спецификация проекта имеет полный список действительных свойств для прослушивания мутаций :
childList
- Установите значение
true
, если мутации для целей дети должны быть обнаружены.attributes
- Установите на
true
, если необходимо соблюдать мутации для атрибутов цели.characterData
- Установите на
true
, если необходимо наблюдать мутации данных цели.поддерево
- Установите, чтобы
true
, если мутации не просто нацелены, но также должны наблюдаться потомки цели.attributeOldValue
- Установите значение
true
еслиattributes
установлено значение true и значение атрибута цели до того, как необходимо записать мутацию.characterDataOldValue
- Установите значение
true
, еслиcharacterData
установлено значение true и данные цели до того, как необходимо записать мутацию.attributeFilter
blockquote>
- Установить список локальных имен атрибутов (без пространства имен) если не все атрибутные мутации
(Этот список действует с апреля 2014 года; вы можете проверить спецификацию на любые изменения.)
Страница руководства MySQL на подготовленных операторах предоставляет большую информацию (который должен относиться к любому другому RDBMS).
В основном Ваш оператор анализируется и обрабатывается заранее, и параметры отправляются отдельно вместо того, чтобы быть обработанными наряду с кодом SQL. Это устраняет АТАКИ С ИСПОЛЬЗОВАНИЕМ КОДА НА SQL, потому что SQL анализируется, прежде чем параметры даже устанавливаются.
в терминах неспециалиста: если подготовленный оператор будет отправлен затем, то DB будет использовать план, если это будет доступно, он не должен не воссоздавать план каждый раз, когда этот запрос отправляется, но только значения параметрических усилителей изменились. это очень похоже на то, как procs работают, дополнительная выгода с procs - то, что можно дать разрешение через procs только а не к базовым таблицам вообще
Если Вы используете MS SQL, загружаете профилировщика, и Вы будете видеть, какие SQL-операторы сгенерированы при использовании параметризированных запросов. Вот пример (я использую Предприятие Libary 3.1, но результатами является то же использование SqlParameters непосредственно) против SQL Server 2005:
string sql = "SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did";
Database db = DatabaseFactory.CreateDatabase();
using(DbCommand cmd = db.GetSqlStringCommand(sql))
{
db.AddInParameter(cmd, "DomName", DbType.String, "xxxxx.net");
db.AddInParameter(cmd, "Did", DbType.Int32, 500204);
DataSet ds = db.ExecuteDataSet(cmd);
}
Это генерирует:
exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
N'@DomName nvarchar(9),
@Did int',
@DomName=N'xxxxx.net',
@Did=500204
Можно также видеть здесь, если символы цитаты были переданы как параметры, их оставляют соответственно:
db.AddInParameter(cmd, "DomName", DbType.String, "'xxxxx.net");
exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
N'@DomName nvarchar(10),
@Did int',
@DomName=N'''xxxxx.net',
@Did=500204