|
楼主 |
发表于 2019-4-8 16:52:27
|
显示全部楼层
[ol][*]/*
[*]Embedded SVG-edit API
[*]
[*]General usage:
[*]- Have an iframe somewhere pointing to a version of svg-edit > r1000
[*]- Initialize the magic with:
[*]var svgCanvas = new EmbeddedSVGEdit(window.frames.svgedit);
[*]- Pass functions in this format:
[*]svgCanvas.setSvgString('string')
[*]- Or if a callback is needed:
[*]svgCanvas.setSvgString('string')(function(data, error){
[*] if (error){
[*] // There was an error
[*] } else{
[*] // Handle data
[*] }
[*]})
[*]
[*]Everything is done with the same API as the real svg-edit,
[*]and all documentation is unchanged.
[*]
[*]However, this file depends on the postMessage API which
[*]can only support JSON-serializable arguments and
[*]return values, so, for example, arguments whose value is
[*]'undefined', a function, a non-finite number, or a built-in
[*]object like Date(), RegExp(), etc. will most likely not behave
[*]as expected. In such a case one may need to host
[*]the SVG editor on the same domain and reference the
[*]JavaScript methods on the frame itself.
[*]
[*]The only other difference is
[*]when handling returns: the callback notation is used instead.
[*]
[*]var blah = new EmbeddedSVGEdit(window.frames.svgedit);
[*]blah.clearSelection('woot', 'blah', 1337, [1, 2, 3, 4, 5, 'moo'], -42, {a: 'tree',b:6, c: 9})(function(){console.log('GET DATA',arguments)})
[*]*/
[*]
[*](function () {'use strict';
[*]
[*]var cbid = 0;
[*]
[*]function getCallbackSetter (d) {
[*] return function () {
[*] var t = this, // New callback
[*] args = [].slice.call(arguments),
[*] cbid = t.send(d, args, function(){}); // The callback (currently it's nothing, but will be set later)
[*]
[*] return function(newcallback){
[*] t.callbacks[cbid] = newcallback; // Set callback
[*] };
[*] };
[*]}
[*]
[*]/*
[*]* Having this separate from messageListener allows us to
[*]* avoid using JSON parsing (and its limitations) in the case
[*]* of same domain control
[*]*/
[*]function addCallback (t, data) {
[*] var result = data.result || data.error,
[*] cbid = data.id;
[*] if (t.callbacks[cbid]) {
[*] if (data.result) {
[*] t.callbacks[cbid](result);
[*] } else {
[*] t.callbacks[cbid](result, 'error');
[*] }
[*] }
[*]}
[*]
[*]function messageListener (e) {
[*] // We accept and post strings as opposed to objects for the sake of IE9 support; this
[*] // will most likely be changed in the future
[*] if (typeof e.data !== 'string') {
[*] return;
[*] }
[*] var allowedOrigins = this.allowedOrigins,
[*] data = e.data && JSON.parse(e.data);
[*] if (!data || typeof data !== 'object' || data.namespace !== 'svg-edit' ||
[*] e.source !== this.frame.contentWindow ||
[*] (allowedOrigins.indexOf('*') === -1 && allowedOrigins.indexOf(e.origin) === -1)
[*] ) {
[*] return;
[*] }
[*] addCallback(this, data);
[*]}
[*]
[*]function getMessageListener (t) {
[*] return function (e) {
[*] messageListener.call(t, e);
[*] };
[*]}
[*]
[*]/**
[*]* @param {HTMLIFrameElement} frame
[*]* @param {array} [allowedOrigins=[]] Array of origins from which incoming
[*]* messages will be allowed when same origin is not used; defaults to none.
[*]* If supplied, it should probably be the same as svgEditor's allowedOrigins
[*]*/
[*]function EmbeddedSVGEdit (frame, allowedOrigins) {
[*] if (!(this instanceof EmbeddedSVGEdit)) { // Allow invocation without 'new' keyword
[*] return new EmbeddedSVGEdit(frame);
[*] }
[*] this.allowedOrigins = allowedOrigins || [];
[*] // Initialize communication
[*] this.frame = frame;
[*] this.callbacks = {};
[*] // List of functions extracted with this:
[*] // Run in firebug on http://svg-edit.googlecode.com/svn/trunk/docs/files/svgcanvas-js.html
[*]
[*] // for (var i=0,q=[],f = document.querySelectorAll('div.CFunction h3.CTitle a'); i 复制代码 |
|