123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- <!--**
- * forked from:https://github.com/F-loat/mpvue-wxParse
- *
- * github地址: https://github.com/dcloudio/uParse
- *
- * for: uni-app框架下 富文本解析
- *
- * 优化 by gaoyia@qq.com https://github.com/gaoyia/parse
- */-->
- <template>
- <!--基础元素-->
- <div class="wxParse" :class="className" :style="'user-select:' + userSelect">
- <block v-for="(node, index) of nodes" :key="index" v-if="!loading">
- <wxParseTemplate :node="node" />
- </block>
- </div>
- </template>
- <script>
- import HtmlToJson from "./libs/html2json";
- import wxParseTemplate from "./components/wxParseTemplate0";
- export default {
- name: "wxParse",
- props: {
- // user-select:none;
- userSelect: {
- type: String,
- default: "text", //none |text| all | element
- },
- imgOptions: {
- type: [Object, Boolean],
- default: function () {
- return {
- loop: false,
- indicator: "number",
- longPressActions: false,
- // longPressActions: {
- // itemList: ['发送给朋友', '保存图片', '收藏'],
- // success: function (res) {
- // console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
- // },
- // fail: function (res) {
- // console.log(res.errMsg);
- // }
- // }
- // }
- };
- },
- },
- loading: {
- type: Boolean,
- default: false,
- },
- className: {
- type: String,
- default: "",
- },
- content: {
- type: String,
- default: "",
- },
- noData: {
- type: String,
- default: '<div style="color: red;">数据不能为空</div>',
- },
- startHandler: {
- type: Function,
- default() {
- return (node) => {
- node.attr.class = null;
- node.attr.style = null;
- };
- },
- },
- endHandler: {
- type: Function,
- default: null,
- },
- charsHandler: {
- type: Function,
- default: null,
- },
- imageProp: {
- type: Object,
- default() {
- return {
- mode: "aspectFit",
- padding: 0,
- lazyLoad: false,
- domain: "",
- };
- },
- },
- },
- components: {
- wxParseTemplate,
- },
- data() {
- return {
- nodes: {},
- imageUrls: [],
- wxParseWidth: {
- value: 0,
- },
- };
- },
- computed: {},
- mounted() {
- this.setHtml();
- },
- methods: {
- setHtml() {
- this.getWidth().then((data) => {
- this.wxParseWidth.value = data;
- });
- let {
- content,
- noData,
- imageProp,
- startHandler,
- endHandler,
- charsHandler,
- } = this;
- let parseData = content || noData;
- let customHandler = {
- start: startHandler,
- end: endHandler,
- chars: charsHandler,
- };
- let results = HtmlToJson(parseData, customHandler, imageProp, this);
- this.imageUrls = results.imageUrls;
- // this.nodes = results.nodes;
- this.nodes = [];
- results.nodes.forEach((item) => {
- setTimeout(() => {
- this.nodes.push(item);
- }, 0);
- });
- },
- getWidth() {
- return new Promise((res, rej) => {
- // #ifndef MP-ALIPAY || MP-BAIDU
- uni
- .createSelectorQuery()
- .in(this)
- .select(".wxParse")
- .fields(
- {
- size: true,
- scrollOffset: true,
- },
- (data) => {
- res(data.width);
- },
- )
- .exec();
- // #endif
- // #ifdef MP-BAIDU
- const query = swan.createSelectorQuery();
- query.select(".wxParse").boundingClientRect();
- query.exec((obj) => {
- const rect = obj[0];
- if (rect) {
- res(rect.width);
- }
- });
- // #endif
- // #ifdef MP-ALIPAY
- my.createSelectorQuery()
- .select(".wxParse")
- .boundingClientRect()
- .exec((ret) => {
- res(ret[0].width);
- });
- // #endif
- });
- },
- navigate(href, $event, attr) {
- console.log(href, attr);
- this.$emit("navigate", href, $event);
- },
- preview(src, $event) {
- // if (!this.imageUrls.length || typeof this.imgOptions === 'boolean') {
- // } else {
- // uni.previewImage({
- // current: src,
- // urls: this.imageUrls,
- // loop: this.imgOptions.loop,
- // indicator: this.imgOptions.indicator,
- // longPressActions: this.imgOptions.longPressActions
- // });
- // }
- // this.$emit('preview', src, $event);
- },
- removeImageUrl(src) {
- const { imageUrls } = this;
- imageUrls.splice(imageUrls.indexOf(src), 1);
- },
- },
- // 父组件中提供
- provide() {
- return {
- parseWidth: this.wxParseWidth,
- parseSelect: this.userSelect,
- // 提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。
- };
- },
- watch: {
- content() {
- this.setHtml();
- },
- // content: {
- // handler: function(newVal, oldVal) {
- // if (newVal !== oldVal) {
- //
- // }
- // },
- // deep: true
- // }
- },
- };
- </script>
|