src/cm/media/js/lib/yui/yui3.0.0/examples/get/get-script-basic_clean.html
author raph
Mon, 23 Nov 2009 15:14:29 +0100
changeset 0 40c8f766c9b8
permissions -rw-r--r--
import from internal svn r 4007


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Getting a Script Node with JSON Data</title>

<style type="text/css">
/*margin and padding on body element
  can introduce errors in determining
  element position and are not recommended;
  we turn them off as a foundation for YUI
  CSS treatments. */
body {
	margin:0;
	padding:0;
}
</style>

<link type="text/css" rel="stylesheet" href="../../build/cssfonts/fonts-min.css" />
<script type="text/javascript" src="../../build/yui/yui-debug.js"></script>


<!--begin custom header content for this example-->
<style type="text/css">
#container ol {
	/*bringing lists on to the page with breathing room */
	margin-left:2em !important;
}

#container ol li {
	/*giving OL's LIs generated numbers*/
	list-style: decimal outside !important;	
}

#container h3 {
	margin-top: 1em;
}
</style>
<!--end custom header content for this example-->

</head>

<body class=" yui-skin-sam">

<h1>Getting a Script Node with JSON Data</h1>

<div class="exampleIntro">
	<p>This example employs the <a href="http://developer.yahoo.com/yui/3/get/">YUI
Get Utility</a> in a simple use case: retrieving JSON data from a cross-domain
web service. While this is a relatively common usage, it's important to
understand the security ramifications of this technique. Scripts loaded via the
Get Utility (or any other &quot;script node&quot; solution) execute immediately
once they are loaded. If you do not fully control (or fully trust) the script's
source, this is not a safe technique and it can put the security of your users'
data at risk. (For more information on the dangers of cross-site scripting
[XSS] exploits, <a
href="http://en.wikipedia.org/wiki/Cross-site_scripting">check out the
Wikipedia entry on this subject</a>.)</p> <p>Here, we will use a trusted Yahoo!
Search web service called <a
href="http://developer.yahoo.com/search/siteexplorer/V1/inlinkData.html">Site
Explorer</a> to return a list of inbound links for a given URL. The principal
difference between this example and similar examples using <a
href="http://developer.yahoo.com/yui/3/io/">YUI IO Utility</a> is
that this technique does not require a server-side proxy. The browser connects
directly to the third-party web service without bouncing through a proxy page
as is required when using the XMLHttpRequest object (on which IO Utility
relies).</p>
			
</div>

<!--BEGIN SOURCE CODE FOR EXAMPLE =============================== -->

<div id="container">

    <!--Use a real form that works without JavaScript:-->
    <form method="GET" action="http://siteexplorer.search.yahoo.com/advsearch" id="siteExplorer">

        <label for="searchString">Site URL:</label> <input type="text" name="p" id="searchString" value="http://developer.yahoo.com/yui" size="40">
        
        <input type="hidden" name="bwm" value="i">
        <input type="hidden" name="bwms" value="p">
    
        <input type="submit" id="siteExplorerData" value="Click here to get JSON data.">
    
    </form>

    <div id="results">
        <!--JSON output will be written to the DOM here-->
        
    </div>
</div>

<script type="text/javascript">

YUI({base:"../../build/", timeout: 10000, filter:"debug", logInclude: {get:true, event:true, example:true}}).use("node", "dump",

function(Y) { 

    // We are going to create a global variable to get the 
    // data back from the web service
    MyNamespace = YUI.namespace('example.SiteExplorer');

    var elResults = Y.one("#results"),
        tIds = {},
        loading = false,
        current = null;
        
    // We use the Get Utility's success handler in conjunction with
    // the web service callback in order to detect bad responses 
    // from the web service.
    var onSiteExplorerSuccess = function(o) {

        // stop blocking requests
        loading = false;

        // A success response means the script node is inserted.  However, the
        // utility is unable to detect whether or not the content of the script
        // node is correct, or even if there was a bad response (like a 404
        // error).  To get around this, we use the web service callback to
        // verify that the script contents was correct.
        if (o.tId in tIds) {
Y.log("The Get Utility has fired the success handler indicating that the " +
          "requested script has loaded and is ready for use.", "info", "example");
        } else {
Y.log("The Get utility has fired onSuccess but the webservice callback did not " +
          "fire.  We could retry the transaction here, or notify the user of the " +
          "failure.", "info", "example");
        }

    };

    var onSiteExplorerFailure = function(o) {
Y.log("The Get Utility failed.", "info", "example");
    };

    var onSiteExplorerTimeout = function(o) {
Y.log("The Get Utility timed out.", "info", "example");
    };
    
    //function to retrieve data from Yahoo! Site Explorer web service --
    // http://developer.yahoo.com/search/siteexplorer/V1/inlinkData.html
    var getSiteExplorerData = function() {
        Y.log("Button clicked; getSiteExplorerData firing.", "info", "example");

        // block multiple requests
        if (loading) {
            return;
        }
        loading = true;
        
        //Load the transitional state of the results section:
        elResults.set("innerHTML", "<h3>Retrieving incoming links for " +
            Y.one("#searchString").get('value') + ":</h3>" +
            "<img src='http://l.yimg.com/a/i/nt/ic/ut/bsc/busybar_1.gif' " +
            "alt='Please wait...'>");
        
        //prepare the URL for the Yahoo Site Explorer API:
        var sURL = "http://search.yahooapis.com/SiteExplorerService/V1/inlinkData?" +
            "appid=3wEDxLHV34HvAU2lMnI51S4Qra5m.baugqoSv4gcRllqqVZm3UrMDZWToMivf5BJ3Mom" +
            "&results=20&output=json&omit_inlinks=domain" +
            "&callback=MyNamespace.callback" +
            "&query=" + encodeURIComponent(Y.one("#searchString").get('value'));
        
        //This simple line is the call to the Get Utility; we pass
        //in the URL and the configuration object, which in this case
        //consists merely of our success and failure callbacks:
        var transactionObj = Y.Get.script(sURL, {
            onSuccess: onSiteExplorerSuccess,
            onFailure: onSiteExplorerFailure,
            onTimeout: onSiteExplorerTimeout,
            timeout: 20000,
            context: Y
        });
        
        //The script method returns a single-field object containing the
        //tranaction id:
        Y.log("Get Utility transaction started; transaction object: " + Y.dump(transactionObj), "info", "example");

        // keep track of the current transaction id.  The transaction will be
        // considered complete only if the web service callback is executed.
        current = transactionObj.tId; 
    };

    MyNamespace.callback = function(results) {
        Y.log("Web service returned data to Y.example.SiteExplorer.callback; beginning to process.", "info", "example");

        // Mark the transaction as complete.  This will be checked by the onSuccess
        // handler to determine if the transaction really succeeded.
        tIds[current] = true;
        
        //work with the returned data to extract meaningful fields:
        var aResults = results.ResultSet.Result;
        var totalLinks = results.ResultSet.totalResultsAvailable;
        var returnedLinkCount = results.ResultSet.totalResultsReturned;
        
        if(aResults) {//there are inbound links; process and display them:
        
            //write header and open list of inbound links:          
            var html = "<h3>There are " +
                totalLinks + 
                " inbound links for this page; here are the first " + 
                returnedLinkCount +
                ":</h3><ol>";
            
            //process list of inbound links:
            for (var i=0; i < aResults.length; i++) {
                html += "<li><strong>" +
                    aResults[i].Title +
                    ":</strong> <a href='" +
                    aResults[i].Url +
                    "'>" + aResults[i].Url +
                    "</a></li>";
            }
            
            //close list of inbound links
            html += "</ol>";
            
        } else {//no inbound links exist for this page:
        
            var html = "<h3>There are no inbound links for the page specified.</h3>";
            
        }
        
        //insert string into DOM:
        elResults.set('innerHTML', html);
    };

    //suppress default form behavior
    Y.on("submit", function(e) {
        e.preventDefault();
        getSiteExplorerData();
    }, "#siteExplorer");

});

</script>

<!--END SOURCE CODE FOR EXAMPLE =============================== -->

</body>
</html>