JavaScript isDOM — Как Вы проверяете, является ли Объектом JavaScript Объект DOM?

Предупреждение: mysql_fetch_array () ожидает, что параметр 1 является ресурсом, boolean given

Прежде всего:

Пожалуйста, не используйте mysql_* функции в новом коде . Они больше не поддерживаются и официально устарели . См. Красную рамку ? Узнайте о подготовленных операторах и используйте PDO или MySQLi - в этой статье , которые помогут вам решить, какой из них. Если вы выберете PDO, вот хороший учебник .


Это происходит, когда вы пытаетесь получить данные из результата mysql_query, но запрос

Это предупреждение и не остановит скрипт, но сделает вашу программу неправильной.

Вам нужно проверить результат, возвращенный mysql_query, на

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

Вопросы, относящиеся

Связанные ошибки:

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

222
задан Peter Mortensen 25 October 2016 в 11:36
поделиться

6 ответов

Это могло бы представлять интерес:

function isElement(obj) {
  try {
    //Using W3 DOM2 (works for FF, Opera and Chrome)
    return obj instanceof HTMLElement;
  }
  catch(e){
    //Browsers not supporting W3 DOM2 don't have HTMLElement and
    //an exception is thrown and we end up here. Testing some
    //properties that all elements have (works on IE7)
    return (typeof obj==="object") &&
      (obj.nodeType===1) && (typeof obj.style === "object") &&
      (typeof obj.ownerDocument ==="object");
  }
}

Это - часть DOM, Level2.

Обновление 2 : Это - то, как я реализовал его в своей собственной библиотеке: (предыдущий код не работал в Chrome, потому что Узел и HTMLElement являются функциями вместо ожидаемого объекта. Этот код тестируется в FF3, IE7, Chrome 1 и Opera 9).

//Returns true if it is a DOM node
function isNode(o){
  return (
    typeof Node === "object" ? o instanceof Node : 
    o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string"
  );
}

//Returns true if it is a DOM element    
function isElement(o){
  return (
    typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
    o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName==="string"
);
}
275
ответ дан Filipp W. 4 November 2019 в 03:37
поделиться

Я думаю, что то, что необходимо сделать, осуществляют полную проверку некоторых свойств, которые всегда будут в dom элементе, но их комбинация не будет наиболее вероятный быть в другом объекте, как так:

var isDom = function (inp) {
    return inp && inp.tagName && inp.nodeName && inp.ownerDocument && inp.removeAttribute;
};
0
ответ дан Andreas Grech 4 November 2019 в 03:37
поделиться

Это из прекрасной библиотеки JavaScript MooTools:

if (obj.nodeName){
    switch (obj.nodeType){
    case 1: return 'element';
    case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
    }
}
5
ответ дан Peter Mortensen 4 November 2019 в 03:37
поделиться

В Firefox можно использовать instanceof Node. То, что Node определяется в DOM1.

, Но это не настолько легко в IE.

  1. "instanceof ActiveXObject" только может сказать, что это - собственный объект.
  2. "typeof document.body.appendChild == 'объект'" говорит, что это может быть Объектом DOM, но также и может быть чем-то еще, имеют ту же функцию.

можно только удостовериться, что это - элемент DOM при помощи функции DOM и выгоды если любое исключение. Однако это может иметь побочный эффект (например, изменить объектное внутреннее состояние/performance/memory утечка)

1
ответ дан Dennis C 4 November 2019 в 03:37
поделиться

Вы могли попытаться добавить его к реальному узлу DOM...

function isDom(obj)
{
    var elm = document.createElement('div');
    try
    {
        elm.appendChild(obj);
    }
    catch (e)
    {
        return false;
    }

    return true;
}
8
ответ дан Greg 4 November 2019 в 03:37
поделиться

Все решения выше и ниже (мое решение включая) страдают от возможности того, чтобы быть неправильным, особенно на IE — это довольно возможно к (ре), определяют некоторые объекты/методы/свойства подражать узлу DOM, представляющему недопустимый тест.

Так обычно я использую тестирование утиного стиля ввода: Я тестирую специально для вещей, которые я использую. Например, если я хочу клонировать узел, я тестирую его как это:

if(typeof node == "object" && "nodeType" in node &&
   node.nodeType === 1 && node.cloneNode){
  // most probably this is a DOM node, we can clone it safely
  clonedNode = node.cloneNode(false);
}

В основном это - немного проверки работоспособности + прямой тест для метода (или свойство), я планирую использовать.

Случайно тест выше является хорошим тестом для узлов DOM на всех браузерах. Но если Вы хотите быть на безопасной стороне, всегда проверяют присутствие методов и свойств и проверяют их типы.

РЕДАКТИРОВАНИЕ: IE использует объекты ActiveX представить узлы, таким образом, их свойства не ведут себя как истинный объект JavaScript, например:

console.log(typeof node.cloneNode);              // object
console.log(node.cloneNode instanceof Function); // false

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

11
ответ дан Eugene Lazutkin 4 November 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: