skip to Main Content

js beginner here. the ebay website has sample code for sending an api request with javascript. the code works out of the box, but the code breaks when i wrap the entire code inside of:

(document).ready( function() {
('button').click( function() {
//(ebays sample code here)
}); });

google chromes console says my error is:

Uncaught ReferenceError: _cb_findItemsByKeywords is not defined
at http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME=micahelr-layitont-PRD-f51ca6568-6366e278&GLOBAL-ID=EBAY-US&RESPONSE-DATA-FORMAT=JSON&callback=_cb_findItemsByKeywords&REST-PAYLOAD&keywords=accord&paginationInput.entriesPerPage=5&itemFilter(0).name=MaxPrice&itemFilter(0).value=30&itemFilter(0).paramName=USD&itemFilter(1).name=ListingType&itemFilter(1).value(0)=AuctionWithBIN&itemFilter(1).value(1)=FixedPrice:1:5
(anonymous) @ svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME=micahelr-layitont-PRD-f51ca6568-6366e278&GLOBAL-ID=EBAY-US&RESPONSE-DATA-FORMAT=JSON&callback=_cb_findItemsByKeywords&REST-PAYLOAD&keywords=accord&paginationInput.entriesPerPage=5&itemFilter(0).name=MaxPrice&itemFilter(0).value=30&itemFilter(0).paramName=USD&itemFilter(1).name=ListingType&itemFilter(1).value(0)=AuctionWithBIN&itemFilter(1).value(1)=FixedPrice:1

what i have come up with, is that the scope of my callback function is incorrect. ive moved the .ready() and .click() statements in many different places within the script tags, trying to solve the problem without completely understanding how it can be fixed. i tried reading about function scope but it seems like its something that i just cant figure out. the following is the content of mt HTML file with embedded JS code:

<html>
<head>
</head>
<body>
<button>click</button>   


<script>
$(document).ready(function() {
$('button').click( function() {


var urlfilter = "";
item_MaxPrice = Number(document.getElementById('pagePrice').innerHTML);    
inputKeywords = 'accord';


var filterarray = [ {"name":"MaxPrice", "value":item_MaxPrice, "paramName":"USD"}, ];


function _cb_findItemsByKeywords(root) {
    var items = root.findItemsByKeywordsResponse[0].searchResult[0].item || [];
    var html = [];
    html.push('<table width="100%" border="0" cellspacing="0" cellpadding="3">

    for (var i = 0; i < items.length; ++i) {
        var item = items[i];
        html.push('text here');};
    document.getElementById("results").innerHTML = html.join("");};



// Generates an indexed URL snippet from the array of item filters
function  buildURLArray() {
    for(var i=0; i<filterarray.length; i++) {
        var itemfilter = filterarray[i];
        for(var index in itemfilter) {
            if (itemfilter[index] !== "") {
            if (itemfilter[index] instanceof Array) {
            for(var r=0; r<itemfilter[index].length; r++) {
                var value = itemfilter[index][r];
                urlfilter += "&itemFilter(" + i + ")." + index + "(" + r + ")=" + value ;
      }
    }
    else {
      urlfilter += "&itemFilter(" + i + ")." + index + "=" + 
itemfilter[index];
    }}}}}



// Execute the function to build the URL filter
buildURLArray(filterarray);    


var url = "http://svcs.ebay.com/services/search/FindingService/v1";
    url += "?OPERATION-NAME=findItemsByKeywords";
    url += "&SERVICE-VERSION=1.0.0";
    url += "&SECURITY-APPNAME=micahelr-layitont-PRD-f51ca6568-6366e278";
    url += "&GLOBAL-ID=EBAY-US";
    url += "&RESPONSE-DATA-FORMAT=JSON";
    url += "&callback=_cb_findItemsByKeywords";
    url += "&REST-PAYLOAD";
    url += "&keywords="+inputKeywords;
    url += "&paginationInput.entriesPerPage=5";
    url += urlfilter;


s=document.createElement('script'); // create script element
s.src= url;
document.body.appendChild(s);    
document.write("<a href='" + url + "'>" + url + "</a>");
})});
</script>

</body>
<footer>&copy;darnell cross 2018</footer>
</html>

2

Answers


  1. Hopefully this helps you understand scope with indentation levels. Normally when you indent you use it to help you visualize the levels of scope. A variable declared in a parent scope can be accessed in the child but not the other way around.

    <html>
    
    <head>
    </head>
    
    <body>
      <button>click</button>
    
    
      <script>
        $(document).ready(function() {
              $('button').click(function() {
    
                  //start of scope
                  var urlfilter = "";
                  item_MaxPrice = Number(document.getElementById('pagePrice').innerHTML);
                  inputKeywords = 'accord';
    
    
                  var filterarray = [{
                    "name": "MaxPrice",
                    "value": item_MaxPrice,
                    "paramName": "USD"
                  }, ];
    
    
                  function _cb_findItemsByKeywords(root) {                           
                    var items = root.findItemsByKeywordsResponse[0].searchResult[0].item || [];
                    var html = [];
                    html.push('<table width="100%" border="0" cellspacing="0" cellpadding="3">
    
                      for (var i = 0; i < items.length; ++i) {
                         //start of new scope (can access everything in parent scope but nothing in a scope that is further nested    
                        var item = items[i];
                        html.push('text here');
                        //end of new scope
                      }; document.getElementById("results").innerHTML = html.join("");
                    };
    
    
    
                    // Generates an indexed URL snippet from the array of item filters
                    function buildURLArray() {
                      for (var i = 0; i < filterarray.length; i++) {
                        var itemfilter = filterarray[i];
                        for (var index in itemfilter) {
                          if (itemfilter[index] !== "") {
                            if (itemfilter[index] instanceof Array) {
                              for (var r = 0; r < itemfilter[index].length; r++) {
                                var value = itemfilter[index][r];
                                urlfilter += "&itemFilter(" + i + ")." + index + "(" + r + ")=" + value;
                              }
                            } else {
                              urlfilter += "&itemFilter(" + i + ")." + index + "=" +
                                itemfilter[index];
                            }
                          }
                        }
                      }
                    }
    
    
    
                    // Execute the function to build the URL filter
                    buildURLArray(filterarray);
    
    
                    var url = "http://svcs.ebay.com/services/search/FindingService/v1";
                    url += "?OPERATION-NAME=findItemsByKeywords";
                    url += "&SERVICE-VERSION=1.0.0";
                    url += "&SECURITY-APPNAME=micahelr-layitont-PRD-f51ca6568-6366e278";
                    url += "&GLOBAL-ID=EBAY-US";
                    url += "&RESPONSE-DATA-FORMAT=JSON";
                    url += "&callback=_cb_findItemsByKeywords";
                    url += "&REST-PAYLOAD";
                    url += "&keywords=" + inputKeywords;
                    url += "&paginationInput.entriesPerPage=5";
                    url += urlfilter;
    
    
                    s = document.createElement('script'); // create script element
                    s.src = url;
                    document.body.appendChild(s);
                    document.write("<a href='" + url + "'>" + url + "</a>");
                  })
              //end of button scope
              });
      </script>
    
    </body>
    <footer>&copy;darnell cross 2018</footer>
    
    </html>
    
    Login or Signup to reply.
  2. Uncaught ReferenceError: _cb_findItemsByKeywords is not defined

    You are getting this error because Javascript can’t find the _cb_findItemsByKeywords function.

    What is the problem?

    You are creating a script element and adding it to the DOM which is having _cb_findItemsByKeywords function as a callback in the URL.

    s=document.createElement(‘script’); // create script element s.src=
    url; document.body.appendChild(s); document.write(“” + url + “”);

    Now, the script would run in the global context and wouldn’t find any _cb_findItemsByKeywords function there because you defined it inside of another function.

    $(document).ready(function() {...}

    (Remember: Every function creates it’s own context)

    Solution:

    Add the _cb_findItemsByKeywords function to the window object.

    window._cb_findItemsByKeywords = function() {...}
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search