Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行bookmarkletjavascript有困难_Javascript_Bookmarklet - Fatal编程技术网

执行bookmarkletjavascript有困难

执行bookmarkletjavascript有困难,javascript,bookmarklet,Javascript,Bookmarklet,我正在尝试创建一个bookmarklet应用程序,它解析来自Amazon、Etsy和JCrew的信息,并将其传输到Rails内置的wishlist应用程序。我成功地创建了一个书签按钮,将我的javascript文件加载到DOM中,但它似乎没有正确执行并将数据传递给我的应用程序。或者我的javascript有问题。谁能帮我找出我做错了什么?我已将我的js文件包括在下面: function() { function get_amazon_product_info() {

我正在尝试创建一个bookmarklet应用程序,它解析来自Amazon、Etsy和JCrew的信息,并将其传输到Rails内置的wishlist应用程序。我成功地创建了一个书签按钮,将我的javascript文件加载到DOM中,但它似乎没有正确执行并将数据传递给我的应用程序。或者我的javascript有问题。谁能帮我找出我做错了什么?我已将我的js文件包括在下面:

function() {

function get_amazon_product_info() 
    {
        var title_span = document.getElementById("btAsinTitle");
        var title = title_span.innerText;

        var image_tag = document.getElementById("main-image");
        var image = image_tag.getAttribute("src");

        var price_span = document.getElementById("actualPriceValue");
        var price = price_span.innerText;

        var product_info = {
            title: title,
            image: image,
            price: price
        }
        return product_info
    }

function get_etsy_product_info()
{
        var title_span = document.getElementById("item-title");
        var title = title_span.innerText;

        var image_div = document.getElementById("fullimage_link1");
        var image_tag = image_div.getElementsByTagName("img");
        var image = image_tag[0].getAttribute("src");

        var price_div = document.getElementsByClassName("item-price");
        var price_span = price_div[0].getElementsByClassName("currency-value")
        var price = price_span[0].innerText;

        var product_info = {
            title: title,
            image: image,
            price: price
        }
        return product_info
}

function get_jcrew_product_info()
{
    var title_span = document.getElementById("pdp-title");
        var title = title_span.innerText;

        var image_div = document.getElementsByClassName("prod_main_img");
        var image_tag = image_div[0].getElementsByTagName("img");
        var image = image_tag[0].getAttribute("src");

        //lame implementation -- need to be able to determine which radio button is checked. Finish later!

        var price_div = document.getElementsByClassName("pdp-shapes");
        var price_span = price_div[0].getElementsByClassName("price")
        var price = price_span[0].innerText;

        var product_info = {
            title: title,
            image: image,
            price: price
        }
        return product_info
}

function determine_params() 
{
        domain = document.domain;
        if (domain == 'www.amazon.com')
        {   
            get_amazon_product_info();
        }
        else if (domain == 'www.etsy.com')
        {
            get_etsy_product_info();
        }
        else if (domain == 'www.jcrew.com')
        {
            get_jcrew_product_info();
        }
}   

function send_data(product_info)
{           
    var link_url = document.URL;
    var http = new XMLHttpRequest();
    var url = "http://max-miller.local:3000/add_product";
    var params = "title=" + product_info[title] + "&image=" + product_info[image] + "&price=" + product_info[price] + "&link_url=" + link_url;
    http.open("POST", url , true);

    //Send the proper header information along with the request
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http.setRequestHeader("Content-length", params.length);
    http.setRequestHeader("Connection", "close");

    http.onreadystatechange = function() {
        if(http.readyState == 4 && http.status == 200) {
            alert(http.responseText);
        }
    }

    http.send(params);
}

determine_params();
send_data(product_info);
}希望它能帮助:

我从来没有像您那样使用
http.sed(data)

然而,每当我需要从服务器获得一些东西时,我就在head部分创建了一个script元素

始终使用
json.stringify
,这可能是应用程序无法发送数据的原因之一

还有
如果(s.length>=2000)
在这里使用我的解决方案时要小心,因为你不能通过一个请求发送/接收无限的数据

像这样:

    function createElementScript(src)
    {

        var script = document.createElement("script");
        script.type = 'text/javascript';
        script.src = src;
        //console.log("SRC: "+src);
        var header = document.getElementsByTagName("head");
        header[0].appendChild(script);
    }
其中创建的
src
如下所示:

var s = JSON.stringify({'url': location.href,
                                    'title': document.getElementById('linkbook_article_title').value,
                                    'description': document.getElementById('linkbook_article_textarea').value
                                });
                                if (s.length >= 2000) {
                                    alert('Payload length is over 2000, action may fail.');
                                }
                                createElementScript(apiURL + "/FollowProduct?input=" + encodeURIComponent(s));
我的整个书签,也许能帮助你提高你的书签;我使用了单例模式,只是为了确保在用户多次单击bookmarklet时不会重新插入bookmarklet,我还想封装所有数据

<?php if (false) { ?><script><?php } ?>
    var LinkbookClass = LinkbookClass ? LinkbookClass : function() {

        var assetsURL = '<?= $this->getAssetsUrl(); ?>';
        var apiURL = '<?= Yii::app()->createAbsoluteUrl($this->module->id . '/' . $this->id . '/'); ?>';
        var imgsList = new Array();
        var ImgsListImgID = 0;
        //all the images found on the webpage
        var images = 0;
        var imgsListHeightWidth = [];
        var isHighlighting = false;
        var versionStatus;
        var flag1 = false;
        var flag2 = false;
        var precedentObj = null;
        var overlay,
                current,
                handler;
        var extractHL;
        var name = false, price = false, image = false;
        //do we save logs ?
        var consoleLog = true;
        var version_popup;
        var f = function()
        {
            createElementScript(assetsURL + '/sizzle.js?x=<?= $this->module->params['interface_version']; ?>');
            createElementScript(assetsURL + '/xpath.js?x=<?= rand(1, 10000000); ?>');
            //LinkbookPluginCollection.run();

            var popupdividreset = "linkbookreset";
            var DOCreset = document.getElementById(popupdividreset);
            if (DOCreset != null) {
                return false;
            }

            var popupdivid = "linkbookdetails";
            var DOC = document.getElementById(popupdivid);
            if (DOC != null) {
                return false;
            }

            //load css file, force a reload/recache
            addCSS(assetsURL + '/linkbook.css?x=<?= rand(1, 10000000); ?>');
            var divreset = document.createElement("div");
            divreset.id = popupdividreset;
            var div = document.createElement("div");
            div.id = popupdivid;
            //this will highlight the DOM element that you are hovering
            var divhighlight = document.createElement("div");
            divhighlight.id = "overlayhighlightlinkbook";
            var divOutside = document.createElement("div");
            divOutside.id = "LinkbookOverlay";
            var divLinkbook = document.createElement("divCloseAffair");
            divLinkbook.id = "divLinkbook";
            var str = '<div id="divemptylinkbook"></div>';
            str += divForm('none', div.id, images);
            str += divLogin('none', div.id);
            str += divDetails('none', div.id);
            str += divSuccess('none', div.id);
            str += divBroken('none', div.id);
            div.innerHTML = str;
            divreset.appendChild(div);
            //not used anymore
            //document.body.insertBefore(divreset, document.body.firstChild);

            divOutside.innerHTML = "";
            //inserting the DOM div blank element imediatly after body tag
            divhighlight.innerHTML = "";
            divLinkbook.appendChild(divhighlight);
            divLinkbook.appendChild(divOutside);
            divLinkbook.appendChild(divreset);
            document.body.insertBefore(divLinkbook, document.body.firstChild);
        };
        function addCSS(url) {
            var headID = document.getElementsByTagName("head")[0];
            var cssNode = document.createElement('link');
            cssNode.type = 'text/css';
            cssNode.rel = 'stylesheet';
            cssNode.href = url;
            cssNode.media = 'screen';
            headID.appendChild(cssNode);
        }
        ;
        function divLogin(displayTarget, div_id)
        {

            return '<?php $this->renderHTMLtoJS('login', array('js' => array('displayTarget', 'div_id', 'assetsURL'))); ?>';
        }
        ;
        function divForm(displayTarget, div_id, images)
        {

            return '<?php $this->renderHTMLtoJS('form', array('js' => array('displayTarget', 'div_id', 'images', 'assetsURL'), 'url' => $url, 'follower' => $follower)); ?>';
        }
        ;
        function divBroken(displayTarget, div_id)
        {

            return '<?php $this->renderHTMLtoJS('report_broken_url', array('js' => array('displayTarget', 'div_id', 'assetsURL'))); ?>';
        }
        ;
        function divSuccess(displayTarget, div_id)
        {

            return '<?php $this->renderHTMLtoJS('success', array('js' => array('displayTarget', 'div_id', 'assetsURL'))); ?>';
        }
        ;
        function divDetails(displayTarget, div_id)
        {
            return '<?php $this->renderHTMLtoJS('details', array('js' => array('displayTarget', 'div_id', 'assetsURL'), 'url' => $url, 'follower' => $follower)); ?>';
        }
        ;
        function createElementScript(src)
        {

            var script = document.createElement("script");
            script.type = 'text/javascript';
            script.src = src;
            //console.log("SRC: "+src);
            var header = document.getElementsByTagName("head");
            header[0].appendChild(script);
        }
        ;
        function hideAllDivs() {
            var a = ['LinkbookParrentLogin', 'LinkbookParrentDetails', 'LinkbookParrentForm'];
            for (x in a) {
                var d = document.getElementById(a[x]);
                if (d) {
                    d.style.display = 'none';
                }
            }
        }
        ;
        function divGallery(displayTarget, div_id)
        {
            return '<?php $this->renderHTMLtoJS('gallery', array('js' => array('displayTarget', 'div_id', 'assetsURL'))); ?>';
        }
        ;
        f.prototype = {
            labelEdit: function()
            {
                if (document.getElementById('form_selected_product_name_Linkbook_input').style.display == 'none')
                {
                    document.getElementById('form_selected_product_name_Linkbook_input').style.display = document.getElementById("divemptylinkbook").style.display;
                    document.getElementById('form_selected_product_name_Linkbook_span').style.display = 'none';
                    document.getElementById('Linkbook_labelEdit').style.display = 'none';
                    document.getElementById('form_selected_product_name_Linkbook_input').value = document.getElementById('form_selected_product_name_Linkbook_span').innerHTML;
                    document.getElementById('form_selected_product_name_Linkbook_input').focus();
                }
            },
            get_article_title: function()
            {
                if (document.title)
                    document.getElementById('linkbook_article_title').value = document.title;
                else
                    document.getElementById('linkbook_article_title').value = location.href;
            },
            get_article_description: function()
            {
                if (document.getElementsByName('description')[0])
                {
                    if (document.getElementsByName('description')[0].getAttribute('content'))
                        document.getElementById('linkbook_article_textarea').value = document.getElementsByName('description')[0].getAttribute('content');
                    else
                        document.getElementById('linkbook_article_textarea').value = 'null';
                }
                else
                    document.getElementById('linkbook_article_textarea').value = 'null';
            },
            init_after_login: function(is_product)
            {
                this.showDiv('LinkbookParrentForm');
            },
            init: function() {
                //console.log('init');
                this.get_article_title();
                this.get_article_description();
                if (<?php
    if (Yii::app()->user->isGuest)
        echo 'true';
    else
        echo 'false';
?>) {
                    this.showDiv('LinkbookParrentLogin');
                } else {

                    Linkbook.init_after_login(<?php
    if (empty($product))
        echo 'false';
    else
        echo 'true';
?>);
                }
            },
            showDiv: function(divId) {
                var d = document.getElementById(divId);
                if (d) {
                    hideAllDivs();
                    d.style.display = document.getElementById("divemptylinkbook").style.display;
                }
            },
            actionSubmit: function(formID, e)
            {
                //alert(formID+'click');
                if (formID == 1)
                    Linkbook.outBound("login");
                if (formID == 2)
                    Linkbook.outBound("follow");
                e.preventDefault();
            },
            toggleItem: function(id) {
                var item = document.getElementById(id);
                if (item) {
                    var parent = item.parentNode;
                    parent.removeChild(item);
                }
            },
            hideDivs: function() {
                hideAllDivs();
            },
            //all the data that has been send from the server to the bookmarlet passed thru this method
            //inBound has 2 parameters, because we need to know the action and the result value
            inBound: function(action, data)
            {

                try {
                    //console.log(data);
                    if (parseInt(data.code) < 0) {
                        //system error
                        alert('Internal error!');
                        return;
                    }
                    switch (action)
                    {
                        case 'login':
                            //console.log('data code: '+data.code);
                            if (data.code != 0) {
                                // show error
                                document.getElementById('LinkbookLoginError').innerHTML = data.message;
                            } else {
                                //console.log(data.login.json_order);
                                //repopulating plugin collection after login action;
                                //LinkbookPluginCollection.cleanup();//cleanup needed
                                //LinkbookPluginCollection.order = data.login.json_order;//repopulation
                                //LinkbookPluginCollection.run();
                                //console.log('new data'+data.login.product);
                                //this.showDiv('LinkbookParrentForm');
                                //console.log(data.login.product.product_name && data.login.product.product_name.length>0);
                                Linkbook.init_after_login(data.login.product.product_name && data.login.product.product_name.length > 0);
                            }
                            break;
                        case 'logout':
                            hideAllDivs();
                            this.showDiv('LinkbookParrentLogin');
                            break;
                        case 'bookmarklet':
                            alert('Bookmarklet error');
                            break;
                        case 'follow':
                            if (data.code != 0)
                            {
                                document.getElementById('form_error_Linkbook').innerHTML = data.message;
                            }
                            else
                            {
                                this.showDiv('LinkbookParrentSuccess');
                            }
                            break;
                        default:
                            alert('Unknown inBound action: ' + action);
                            break;
                    }
                } catch (err) {
                    if (consoleLog) {
                        //console.log(err.toString());
                    }
                    alert('Something went wrong, server returned invalid message!');
                }
            }, //end f inBound()
            //method used to transfer the data from the bookmarklet to the server
            //outBound needs to know only the action, the parameters will be contructed, ex. : ?action=x&...
            outBound: function(action)
            {
                try {
                    switch (action)
                    {//start switch
                        case 'logout':
                            createElementScript(apiURL + '/MakeLogout');
                            break;
                        case 'login':
                            if (document.getElementById("form_remember").value == 'on')
                                form_remember_Linkbook = 1;
                            else
                                form_remember_Linkbook = 0;
                            createElementScript(apiURL + '/MakeLogin/email/' + document.getElementById("form_email").value + '/password/' + document.getElementById("form_password").value + '/remember/' + form_remember_Linkbook + '?url=' + encodeURIComponent(location.href));
                            break;
                        case 'follow':
                            if (true)
                            {
                                //document.getElementById('form_error_Linkbook').innerHTML = '';
                                var s = JSON.stringify({'url': location.href,
                                    'title': document.getElementById('linkbook_article_title').value,
                                    'description': document.getElementById('linkbook_article_textarea').value
                                });
                                if (s.length >= 2000) {
                                    alert('Payload length is over 2000, action may fail.');
                                }
                                createElementScript(apiURL + "/FollowProduct?input=" + encodeURIComponent(s));
                            } else {
                                // put error message on screen
                                document.getElementById('form_error_Linkbook').innerHTML = 'error';
                            }
                            break;
                        case 'report_broken_url':
                            this.showDiv('LinkbookParrentBroken');
                            //var s = JSON.stringify(LinkbookPluginCollection);
                            if (s.length >= 2000) {
                                alert('Payload length is over 2000, action may fail.');
                            }
                            createElementScript(apiURL + "/ReportBrokenUrl?input=" + encodeURIComponent(s));
                            break;
                        default:
                            alert('Unknown outBound action: ' + action);
                            break;
                    }//end switch
                }
                catch (err) {
                    if (consoleLog) {
                        //console.log(err.toString());
                    }
                    alert('Something went wrong, couldn\'t prepare data!');
                }


            }//end f outBound()
        }
        return f;
    }();
    var Linkbook = new LinkbookClass();
    Linkbook.init();

var LinkbookClass=LinkbookClass?LinkbookClass:函数(){
var assetsURL='';
var apiURL='';
var imgsList=新数组();
var ImgsListImgID=0;
//在网页上找到的所有图像
var=0;
var imgListHeightWidth=[];
var isHighlighting=假;
变种状态;
var flag1=假;
var flag2=假;
var preventonobj=null;
var覆盖,
现在的
处理者;
var-hl;
var name=false,price=false,image=false;
//我们保存日志吗?
var consoleLog=true;
var版本弹出窗口;
var f=函数()
{
createElementScript(assetsURL+'/sizzle.js?x=');
createElementScript(assetsURL+'/xpath.js?x=');
//LinkbookPluginCollection.run();
var popupdividreset=“linkbookreset”;
var DOCreset=document.getElementById(popupdividreset);
if(DOCreset!=null){
返回false;
}
var popupdivid=“linkbookdetails”;
var DOC=document.getElementById(popupdivid);
如果(DOC!=null){
返回false;
}
//加载css文件,强制重新加载/重新缓存
addCSS(assetsURL+'/linkbook.css?x=');
var divreset=document.createElement(“div”);
divreset.id=popupdividreset;
var div=document.createElement(“div”);
div.id=popupdivid;
//这将突出显示您悬停的DOM元素
var divhighlight=document.createElement(“div”);
divhighlight.id=“overlayhighlightlinkbook”;
var divOutside=document.createElement(“div”);
divOutside.id=“LinkbookOverlay”;
var divLinkbook=document.createElement(“divcloseAffairm”);
divLinkbook.id=“divLinkbook”;
var-str='';
str+=divForm('none',div.id,images);
str+=divLogin('none',div.id);
str+=divDetails('none',div.id);
str+=divSuccess('none',div.id);
str+=divbreaked('none',div.id);
div.innerHTML=str;
divreset.appendChild(div);
//不再使用
//document.body.insertBefore(divreset,document.body.firstChild);
divOutside.innerHTML=“”;
//在body标记后立即插入domdiv空白元素
divhighlight.innerHTML=“”;
divLinkbook.appendChild(divhighlight);
divLinkbook.appendChild(divOutside);
divLinkbook.appendChild(divreset);
document.body.insertBefore(divLinkbook,document.body.firstChild);
};
函数addCSS(url){
var headID=document.getElementsByTagName(“head”)[0];
var cssNode=document.createElement('link');
cssNode.type='text/css';
cssNode.rel='样式表';
cssNode.href=url;
cssNode.media='screen';
头部ID.儿童(cssNode);
}
;
函数divLogin(displayTarget,div\u id)
{
返回“”;
}
;
函数divForm(显示目标、div\u id、图像)
{
返回“”;
}
;
函数divbreak(displayTarget,div\u id)
{
返回“”;
}
;
函数divSuccess(显示目标,div\u id)
{
返回“”;
}
;
函数divDetails(displayTarget,div\u id)
{
返回“”;
}
;
函数createElementScript(src)
{
var script=document.createElement(“脚本”);
script.type='text/javascript';
script.src=src;
//console.log(“SRC:+SRC”);
var header=document.getElementsByTagName(“head”);
标头[0]。追加子项(脚本);
}
;
函数HIDEALDIVS(){
变量a=['LinkbookParrentLogin','LinkbookParrentDetails','LinkbookParrentForm'];
对于(a中的x){
var d=document.getElementById(a[x]);
如果(d){
d、 style.display='none';
}
}
}
;
函数divGallery(显示目标,div\u id)
{
返回“”;
}
;
f、 原型={
labelEdit:function()
{
if(document.getElementById('form\u selected\u product\u name\u Linkbook\u input')。style.display=='none')
{
function() { console.log('something'); }
(function() { console.log('something'); })();