Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Prototype in Firefox


Автор: t77 12.7.2010, 15:53
Доброе время суток.

Имеется код, с использованием прототипов, который работает в браузере ИЕ.
Но почему то он не работает в браузере Файрфокс...
Как использовать прототипы в Gecko-браузерах ?

Автор: skyboy 12.7.2010, 16:11
при помощи javascript-кода, конечно же!
а код, который причина проблемы, и дальше никому не показывай. 
уворуют ещё.
код, который работает только под IE.

Добавлено через 5 секунд
 smile 

Автор: t77 12.7.2010, 16:43
Так вот выглядит код:

Код


   var xmlDom = null;
   
   if (window.ActiveXObject)
   {
        // code for IE
        xmlDom = new ActiveXObject("microsoft.xmlDom");
        xmlDom.async = "false";
        xmlDom.preserveWhiteSpace = true;
   }
   else
   { 
       // code for Firefox 
       xmlDom = document.implementation.createDocument("","",null);
   }    
       
    
    
    var xmlLoader = new XmlLoader(xmlDom, "/folder1/folder2", "http://server:7000");    
    xmlLoader.addParameter("id", "150");    
    xmlLoader.addParameter("item_order_by", "order_id");
    

    if (!xmlLoader.open())
        return reportError(xmlLoader, "Getting xml with id: 150");

    var xmlDoc = xmlLoader.resultXml;
    xmlLoader.close();

    var allData = xmlDoc;
   
}


function XmlLoader (xmlObject, strAction, urlLocation, callback)
{
    this.action = strAction;          
    this.urlLoc = urlLocation;        

    this.arrParams = new Array();     
    this.paramString = "";
    this.resultXml = null;
    this.xmlObj = xmlObject;
    this.status = "";


    if (typeof XmlLoader._initialized == "undefined")
    {
        // [Public]
        // Add a parameter to the request.
        XmlLoader.prototype.addParameter = function (pName, pValue)
        {
            this.arrParams.push(pName, pValue);
            this.updateString();
        }

        // [Public]
        // Removes a parameter (and rebuilds the url string)
        XmlLoader.prototype.removeParameter = function (pName)
        {
            var newArr = new Array();
            for (var i = 0 ; i < this.arrParams.length ; i+=2)
            {
                if (this.arrParams[i] != pName)
                {
                    newArr.push (this.arrParams[i], this.arrParams[i+1]);
                }

            }

            this.arrParams = newArr;
            this.updateString();
        }

        // [Private]
        // Rebuilds the ParamString when parameters have changed etc
        XmlLoader.prototype.updateString = function ()
        {
            var str = "";

            for (var i = 0 ; i < this.arrParams.length ; i += 2)
            {
                if (this.toIso != null)
                    str += this.arrParams[i] + "=" + this.arrParams[i + 1];
                else
                    str += this.arrParams[i] + "=" + this.arrParams[i + 1];

                if (i < this.arrParams.length - 2)
                    str += "&";
            }

            this.paramString = str;
        }

        // [Public]
        // Returns the parameter string
        XmlLoader.prototype.getParamString = function ()
        {
            return this.paramString;
        }

        // [public]
        // Sends request to the server. Results are stored in "resultXml" property (DOMDocument object)
        XmlLoader.prototype.open = function()
        {
            // Trick to determine which type of object we were sent with
            var isXmlHttp = true;
            if (this.xmlObj.async != null)
            {
                isXmlHttp = false;
            }

            // Initialize the result XML
            this.resultXml = null;
            this.resultXml = new ActiveXObject("Msxml.DOMDocument");
            this.resultXml.async = "false";

            if (isXmlHttp)
            {
                // Load using Microsoft.XmlHttp object
                this.xmlObj.open("POST", this.urlLoc + this.action , false);
                this.xmlObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                this.xmlObj.send(this.paramString);

                this.xmlObj.responseXML.load(this.xmlObj.responseStream);  // xmlObj.responseText has a problems in some languages
                this.resultXml.loadXML(this.xmlObj.responseXML.xml);

            }
            else
            {
                // Load using Microsoft.XmlDom object
                this.xmlObj.async = false;
                var url = this.urlLoc + this.action + "?" + this.paramString;
                this.xmlObj.load(url);

                if (this.xmlObj.documentElement != null)
                    this.resultXml.loadXML(this.xmlObj.documentElement.xml);
            }

            if (this.resultXml == null)
            {
                this.resultXml.loadXML("<ERROR><MSG>Internal Error: document received from server is empty</MSG></ERROR>");
                return false;
            }

            var message = this.resultXml.selectSingleNode('//MESSAGE');

            if (message != null)
            {
                this.status = message.getAttribute("status");

                if (this.status == "SUCCESS")
                    return true;
                else
                {
                    try
                    {
                        this.messageId =  message.getAttribute("id");
                    }
                    catch(e) {}

                    return false;
                }
            }

            if (this.resultXml.selectSingleNode('//ERROR'))
                return false;

            return true;
        }

        // [public]
        // Rids of the xmlDoc
        XmlLoader.prototype.close = function()
        {
            this.resultXml = null;
        }

        // [public property]
        // Returns the xmlDoc object
        XmlLoader.prototype.resultXml = function()
        {
            return this.resultXml;
        }

        XmlLoader._initialized = true;
    }
}


Помогите пожалуйста подправить код под браузер Firefox.

Автор: Amphiluke 12.7.2010, 18:57
Сильно не вчитывался, но тут, по-моему не в прототипах дело, а в использовании методов, которые поддерживаются в IE, но не в FF (типа loadXML, selectSingleNode, а также свойства xml объекта documentElement).

Цитата(t77 @  12.7.2010,  20:43 Найти цитируемый пост)
this.resultXml = new ActiveXObject("Msxml.DOMDocument");

Ну, это, понятно, вообще не про FF… Вначале у вас был использован правильный (кроссбраузерный) способ создания XML-документа, а тут что-то решили не заморачиваться.


Далее, например, метод loadXML нужно для FF заменить методом parseFromString объекта https://developer.mozilla.org/en/DOMParser. Метод selectSingleNode не знаю, чем заменить, но поискать альтернативу можно. Либо пересмотреть логику кода.



Автор: t77 13.7.2010, 11:05
Amphiluke , спасибо за ваш ответ.
Проблема кроссброузерности кода и в использовании прототаипов и так вообщем...

Так выглядит список использования различных методов, объектов, свойств в различных броузерах:
Код

----------------------------------------------------------------------------------------------------------------------
 # |        IE                                    |    FIREFOX                                                |
----------------------------------------------------------------------------------------------------------------------
1  |loadXML                                         |parseFromString                                                 |
2  |selectSingleNode                                 |getElementsByTagName                                                                                                                                                                                                 |
3  |xml.documentElement                                 |var serializer = new XMLSerializer();
    |                                                |var xml = serializer.serializeToString(doc);                                                                 |
4  |xmlDom = new ActiveXObject("microsoft.xmlDom")  |xmlDom = document.implementation.createDocument("","",null)     |


Коментарии приветствуются.
Буду признателен всем кто поможет добавить в данный список дополнительные строки.

Добавлено через 4 минуты и 50 секунд
Мозила ругается на строку 52, в вышеприведенном коде:
Код

this.arrParams.push(pName, pValue);

Не могу понять, в чем дело...?? smile 
Что я делаю не так?

Автор: Amphiluke 13.7.2010, 12:16
Цитата(t77 @  13.7.2010,  15:05 Найти цитируемый пост)
Мозила ругается на строку 52, в вышеприведенном коде:

А что пишет-то? У меня не ругается. smile

Добавлено через 2 минуты и 49 секунд
Цитата(t77 @  13.7.2010,  15:05 Найти цитируемый пост)
xml.documentElement

А не наоборот? smile

Автор: t77 13.7.2010, 12:49
Цитата

Цитата(t77 @  13.7.2010,  15:05 ) 
Мозила ругается на строку 52, в вышеприведенном коде: 


А что пишет-то? У меня не ругается.


неизвестный объект arrParams
В отладчике смотрю, что у объекта this нет следующих переменных и объектов:
Код

this.action = strAction;          
this.urlLoc = urlLocation;     
this.arrParams = new Array();    
this.paramString = "";
this.resultXml = null;
this.xmlObj = xmlObject;
this.status = "";

Почему? Что я делаю не так?
Что за ерунда непонятная... 

Автор: t77 19.7.2010, 22:51
Amphiluke, спасибо.
Вопрос решен, тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)