开发者

error when using AJAX in vm mynxx template by rockettheme in virtuemart /Joomla

I am getting error when using the script below in vm mynxx template by rockettheme in virtuemart Joomla 1.5 -

It works fine outside of mynxx

User inputs data into a html form- presses "Get Price" button and a price is returned to same form. Problem is that user is unable to submit to cart

firebug error -

cal开发者_Go百科lback is not a function callback(this.responseText);

my ajax script

function Ajax() {
    this.instance = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
    this.request = function(url, callback) {
        this.instance.open('GET', url, true);
        this.instance.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                callback(this.responseText);
            }
        }
        this.instance.send(null);
    }
}
function validate(form) {
    (new Ajax).request('testform.php?width65=' + form.width65.value + '&length65=' + form.length65.value, function(respons) {
        var prices = eval(respons);
        form.price.value = prices[0];
        form.otherprice.value = prices[1];
    });
}

I think I have tracked the file down to theme.js and require some code to validate the function.

I am new at this and this is way above me - any help would be appreciated

Theme.js code - was packed - ie eval(function(p,a,c,k,e,r){e=function(c)...... I have unpacked it

var RokVM = {};
RokVM.autoHide = 3; // seconds before auto closing the Panel


RokVM.Base=
    {
    uri:window.templatePath,start:function()
        {
        RokVM.Base.quantityBox();
        RokVM.Cart.init()
    }
    ,featuredHeight:function(b)
        {
        b=$(b);
        if(!b)
            {
            return RokVM.Base
        }
        var c=b.getElements(".home-featured-inner");
        var d=0;
        c.each(function(a)
            {
            d=Math.max(a.getSize().size.y,d)
        }
        );
        c.setStyle("height",d)
    }
    ,quantityBox:function()
        {
        var h=$$(".cart-quantity-box, .home-featured-cartblock");
        if(h.length)
            {
            h.each(function(b)
                {
                var c=b.getElement(".quantity_box_button_up");
                var d=b.getElement(".quantity_box_button_down");
                var f=b.getElement(".inputboxquantity");
                if(!c||!d||!f)
                    {
                    return
                }
                var g=f.getValue().toInt();
                f.addEvent("keyup",function(e)
                    {
                    e=(new Event(e)).stop();
                    var a=this.value;
                    if(a<0)
                        {
                        a=0
                    }
                    if(isNaN(a))
                        {
                        this.value=1;
                        a=1
                    }
                    if(e.key=="up")
                        {
                        if($type(this.getValue().toInt())=="number")
                            {
                            this.value=++a
                        }
                    }
                    if(e.key=="down")
                        {
                        if(a>0&&$type(this.getValue().toInt())=="number")
                            {
                            this.value=--a
                        }
                    }
                }
                );
                f.addEvent("mousewheel",function(e)
                    {
                    e=(new Event(e)).stop();
                    var a=this.value;
                    if(a<0)
                        {
                        a=0
                    }
                    if(isNaN(a))
                        {
                        this.value=1;
                        a=1
                    }
                    if(e.wheel==1)
                        {
                        if($type(this.getValue().toInt())=="number")
                            {
                            this.value=++a
                        }
                    }
                    if(e.wheel==-1)
                        {
                        if(a>0&&$type(this.getValue().toInt())=="number")
                            {
                            this.value=--a
                        }
                    }
                }
                );
                c.addEvent("click",function(e)
                    {
                    (new Event(e)).stop();
                    if($type(f.getValue().toInt())=="number")
                        {
                        f.value=++f.value
                    }
                }
                );
                d.addEvent("click",function(e)
                    {
                    (new Event(e)).stop();
                    if(f.getValue().toInt()>0&&$type(f.getValue().toInt())=="number")
                        {
                        f.value=--f.value
                    }
                }
                )
            }
            )
        }
    }
};
RokVM.Cart=
    {
    init:function()
        {
        RokVM.Cart.cartPanel=$("cart-panel");
        RokVM.Cart.cartButton=$("cart-button");
        RokVM.Cart.cartSurround=$("cart-panel-surround");
        if(!RokVM.Cart.cartPanel||!RokVM.Cart.cartButton||!RokVM.Cart.cartSurround)
            {
            return RokVM.Cart
        }
        if(!RokVM.Cart.Fx)
            {
            RokVM.Cart.Fx=(new(Fx.Slide)(RokVM.Cart.cartPanel,
                {
                duration:400,transition:Fx.Transitions.Expo.easeOut
            }
            )).hide()
        }
        RokVM.Cart.cartSurround.setStyle("visibility","visible");
        RokVM.Cart.cartButton.getFirst("a").addEvent("click",function(e)
            {
            (new Event(e)).stop();
            if(!RokVM.Cart.cartPanel.getText().length&&!window.webkit)
                {
                return
            }
            if(!RokVM.Cart.cartPanel.innerHTML.clean().length&&window.webkit)
                {
                return
            }
            var a=RokVM.Cart.cartButton.getElement("strong");
            if(!a||!a.getText().toInt()&&(!RokVM.Cart.cartPanel.getText().length&&!window.webkit))
                {
                return
            }
            RokVM.Cart.clicked=true;
            if(window.fontFx&&window.fontFx.open)
                {
                window.fontFx.toggle()
            }
            if(window.loginFx&&window.loginFx.open)
                {
                window.loginFx.toggle()
            }
            RokVM.Cart.Fx.toggle()
        }
        );
        RokVM.scrollWindow=new(Fx.Scroll)(window);
        RokVM.Cart.getShortList();
        RokVM.Cart.XHRify()
    }
    ,XHRify:function()
        {
        var b=$$(".addtocart_form");
        if(!b.length)
            {
            return RokVM.Cart
        }
        b.each(function(a)
            {
            a.addEvent("submit",RokVM.Cart.add.bindWithEvent(a,true))
        }
        )
    }
    ,add:function(e,c)
        {
        (new Event(e)).stop();
        (new Ajax(this.getProperty("action"),
            {
            data:$(this),evalScripts:true,onComplete:function(r)
                {
                var a=new Element('div').setHTML(r);
                var b=a.getElement('.shop_tip');
                RokVM.Cart.getShortList((r.length&&b)?r:false);
                RokVM.Cart.clicked=c||false
            }
        }
        )).request()
    }
    ,getShortList:function(b)
        {
        var c=
            {
            onComplete:function(a)
                {
                RokVM.Cart.update(a,b)
            }
            ,evalScripts:true,data:
                {
                only_page:1,page:"shop.basket_short",option:"com_virtuemart"
            }
        };
        (new Ajax(RokVM.Base.uri+"index2.php",c)).request()
    }
    ,handleError:function(a)
        {
        var b=RokVM.Cart.cartPanel;
        var c=new Element('div').setHTML(a);
        var d=b.getElement('.show-cart-button');
        var e=c.getElement('.shop_tip').inject((d)?d:b,(d)?'before':'inside')
    }
    ,update:function(a,b)
        {
        RokVM.Cart.cartPanel.setHTML(a);
        var c=RokVM.Cart.cartPanel.getElement(".total_products"),total=0;
        if(c)
            {
            total=c.innerHTML.split(" ")[0].toInt()
        }
        if(!total)
            {
            RokVM.Cart.cartButton.getFirst().setProperty("class","cart-button-desc")
        }
        else
            {
            RokVM.Cart.cartButton.getFirst().setProperty("class","cart-button-desc-full")
        }
        RokVM.Cart.cartButton.getElement("strong").setText(total);
        if(b)RokVM.Cart.handleError(b);
        if(RokVM.Cart.clicked&&a.length||b)
            {
            if(window.fontFx&&window.fontFx.open)
                {
                window.fontFx.toggle()
            }
            if(window.loginFx&&window.loginFx.open)
                {
                window.loginFx.toggle()
            }
            RokVM.scrollWindow.toTop();
            RokVM.Cart.show();
            RokVM.Cart.hide.delay(RokVM.autoHide*1000)
        }
        RokVM.Cart.clicked=false
    }
    ,show:function()
        {
        RokVM.Cart.Fx.slideIn()
    }
    ,hide:function()
        {
        RokVM.Cart.Fx.slideOut()
    }
};
window.addEvent("domready",RokVM.Base.start);
window.addEvent(window.webkit?"load":"domready",function()
    {
    RokVM.Base.featuredHeight("home-featured")
}
);
var live_site = RokVM.Base.url;

Then following - this in the same theme.js file (this is not packed)

/// Following is VM stuff, kept for compatibility


/**
 * This file holds javascript functions that are used by the templates in the Theme
 * 
 */

 // AJAX FUNCTIONS 
function loadNewPage( el, url ) {

    var theEl = $(el);
    var callback = {
        success : function(responseText) {
            theEl.innerHTML = responseText;
            if( Lightbox ) Lightbox.init();
        }
    }
    var opt = {
        // Use POST
        method: 'get',
        // Handle successful response
        onComplete: callback.success
    }
    new Ajax( url + '&only_page=1', opt ).request();
}

function handleGoToCart() { document.location = live_site + '/index.php?option=com_virtuemart&page=shop.cart&product_id=' + formCartAdd.product_id.value ; }

function handleAddToCart( formId, parameters ) {
    formCartAdd = document.getElementById( formId );

    var callback = function(responseText) {
        updateMiniCarts();
        // close an existing mooPrompt box first, before attempting to create a new one (thanks wellsie!)
        /*if (document.boxB) {
            document.boxB.close();
            clearTimeout(timeoutID);
        }

        document.boxB = new MooPrompt(notice_lbl, responseText, {
                buttons: 2,
                width:400,
                height:150,
                overlay: false,
                button1: ok_lbl,
                button2: cart_title,
                onButton2:  handleGoToCart
            });

        setTimeout( 'document.boxB.close()', 3000 );*/
    }

    var opt = {
        // Use POST
        method: 'post',
        // Send this lovely data
        data: $(formId),
        // Handle successful response
        onComplete: callback,

        evalScripts: true
    }

    new Ajax(formCartAdd.action, opt).request();
}
/**
* This function searches for all elements with the class name "vmCartModule" and
* updates them with the contents of the page "shop.basket_short" after a cart modification event
*/
function updateMiniCarts() {
    var callbackCart = function(responseText) {
        carts = $$( '.vmCartModule' );
        if( carts ) {
            try { 
                for (var i=0; i<carts.length; i++){
                    carts[i].innerHTML = responseText;

                    try {
                    color = carts[i].getStyle( 'color' );
                    bgcolor = carts[i].getStyle( 'background-color' );
                    if( bgcolor == 'transparent' ) {
                        // If the current element has no background color, it is transparent.
                        // We can't make a highlight without knowing about the real background color,
                        // so let's loop up to the next parent that has a BG Color
                        parent = carts[i].getParent();
                        while( parent && bgcolor == 'transparent' ) {
                            bgcolor = parent.getStyle( 'background-color' );
                            parent = parent.getParent();
                        }
                    }
                    var fxc = new Fx.Style(carts[i], 'color', {duration: 1000});
                    var fxbgc = new Fx.Style(carts[i], 'background-color', {duration: 1000});

                    fxc.start( '#222', color );                         
                    fxbgc.start( '#fff68f', bgcolor );



                    if( parent ) {
                        setTimeout( "carts[" + i + "].setStyle( 'background-color', 'transparent' )", 1000 );
                    }
                    } catch(e) {}
                }
            } catch(e) {}
        }
    }
    var option = { method: 'post', onComplete: callbackCart, data: { only_page:1,page: "shop.basket_short", option: "com_virtuemart" } }
    new Ajax( live_site + '/index2.php', option).request();
}
/**
* This function allows you to present contents of a URL in a really nice stylish dhtml Window
* It uses the WindowJS, so make sure you have called
* vmCommonHTML::loadWindowsJS();
* before
*/
function fancyPop( url, parameters ) {

    parameters = parameters || {};
    popTitle = parameters.title || '';
    popWidth = parameters.width || 700;
    popHeight = parameters.height || 600;
    popModal = parameters.modal || false;

    window_id = new Window('window_id', {className: "mac_os_x", 
                                        title: popTitle,
                                        showEffect: Element.show,
                                        hideEffect: Element.hide,
                                        width: popWidth, height: popHeight}); 
    window_id.setAjaxContent( url, {evalScripts:true}, true, popModal );
    window_id.setCookie('window_size');
    window_id.setDestroyOnClose();


}


I dont really know this template but in my opinion function callback() is something that should be specified in it's code to make an reaction when there is a positive response from the server (HTTP 200), so can you also give us:

  1. that function
  2. it's localization (ie. if it is located in the same file or not)
  3. and when it's loaded to the DOM: before or after function Ajax() {}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜